实现基于邻接表表示的广度优先遍历。
函数接口定义:
void BFS(ALGraph G, int v);
其中 G 是基于邻接表存储表示的无向图,v表示遍历起点。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#define MVNum 10
#define MAXQSIZE 100
bool visited[MVNum];
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
int info;
}ArcNode;
typedef struct VNode{
char data;
ArcNode *firstarc;
}VNode, AdjList[MVNum];
typedef struct{
AdjList vertices;
int vexnum, arcnum;
}ALGraph;
int CreateUDG(ALGraph &G);//实现细节隐藏
void BFS(ALGraph G, int v);
void BFSTraverse(ALGraph G){
int v;
for(v = 0; v < G.vexnum; ++v)
visited[v] = 0;
for(v = 0; v < G.vexnum; ++v)
if(!visited[v])
BFS(G, v);
}
int main(){
ALGraph G;
CreateUDG(G);
BFSTraverse(G);
return 0;
}
/* 请在这里填写答案 */
输入样例:
输入第1行为结点数vexnum和边数arcnum。第2行为结点的值,依次输入arcnum行,每行输入两个结点的值表示该两个结点互为邻接点。
8 8
ABCDEFGH
A B
A C
B D
B E
C F
C G
D H
E H
结尾无空行
输出样例:
遍历序列。
A C B G F E D H
结尾无空行
C++(g++)
void BFS(ALGraph G, int v)
{
int q[1000];
int l = 0, r = 0;
printf("%c ", G.vertices[v].data);
visited[v] = 1;
q[r++] = v;
ArcNode* t;
while (l < r)
{
t = G.vertices[q[l++]].firstarc;
while (t)
{
int index = t->adjvex;
if (!visited[index])
{
visited[index] = 1;
printf("%c ", G.vertices[index].data);
q[r++] = index;
}
t = t->nextarc;
}
}
}