int Graph_WidthFirst(Graph*g, int start, Edge* tree) //从start号顶点出发宽度优先遍历,(编号从0开始) //返回访问到的顶点数, //tree[]输出遍历树 //返回的tree[0]是(-1, start), //真正的遍历树保存在tree[1..return-1], return是返回值 //顶点的访问次序依次为tree[0].to, tree[1].to, ..., tree[return-1].to //输入时,tree[]的长度至少为顶点数 //返回值是从start出发访问到的顶点数 { const int MAX=1000; Edge queue[MAX]; int head=0, tail=0; #define In__(a,b) {queue[tail].from=a; queue[tail].to=b; tail=(tail+1)%MAX;}///////// #define Out__(a,b) {a=queue[head].from; b=queue[head].to; head=(head+1)%MAX;}// #define QueueNotEmpty (head!=tail?1:0)/////////////////////////////////// #define HasEdge(i,j) (g->adj[(i)*g->n+(j)]==1) char* visited=(char*)malloc(sizeof(char)*g->n); memset(visited, 0, sizeof(char)*g->n); int parent=-1; int curr=start; In__(parent, curr); int k=0; //已经访问的结点数 /*请在BEGIN和END之间实现你的代码*/ /*****BEGIN*****/ /*****END*******/ return k; #undef In__////////////////////////////// #undef Out__/////////////////////////////// #undef QueueNotEmpty//////////////////////// #undef HasEdge }
时间: 2023-06-30 12:20:34 浏览: 126
Graph1_非递归算法进行深度优先遍历和广度优先遍历_
5星 · 资源好评率100%
好的,这是一个宽度优先遍历的函数模板,我可以帮你实现它。在这个模板中,需要实现的代码部分在 `BEGIN` 和 `END` 之间。
下面是我填写的代码,你可以参考一下:
```
int Graph_WidthFirst(Graph* g, int start, Edge* tree) {
const int MAX = 1000;
Edge queue[MAX];
int head = 0, tail = 0;
#define In__(a,b) {queue[tail].from=a; queue[tail].to=b; tail=(tail+1)%MAX;}
#define Out__(a,b) {a=queue[head].from; b=queue[head].to; head=(head+1)%MAX;}
#define QueueNotEmpty (head!=tail?1:0)
#define HasEdge(i,j) (g->adj[(i)*g->n+(j)]==1)
char* visited = (char*) malloc(sizeof(char) * g->n);
memset(visited, 0, sizeof(char) * g->n);
int parent = -1;
int curr = start;
In__(parent, curr);
int k = 0; //已经访问的结点数
while (QueueNotEmpty) {
Out__(parent, curr);
if (!visited[curr]) {
visited[curr] = 1;
tree[k].from = parent;
tree[k].to = curr;
k++;
for (int i = 0; i < g->n; i++) {
if (HasEdge(curr, i) && !visited[i]) {
In__(curr, i);
}
}
}
}
return k;
#undef In__
#undef Out__
#undef QueueNotEmpty
#undef HasEdge
}
```
在这个实现中,我们使用了一个队列 `queue` 来存储待访问的节点。每次从队列中取出一个节点,访问它的所有未被访问过的邻居节点,并将这些邻居节点放入队列中。同时,我们使用一个数组 `visited` 来记录哪些节点已经被访问过。
在遍历过程中,我们还保存了遍历树的信息到数组 `tree` 中,并且使用变量 `k` 记录已经访问的节点数。最后,我们返回已经访问的节点数 `k`。
希望这个实现可以帮到你,如果还有什么问题可以随时问我。
阅读全文