本题要求实现邻接矩阵存储图的广度优先遍历。
函数接口定义:
void BFS(MGraph G,Vertex i);
- 其中
MGraph
是邻接矩阵存储的图,定义如下:
#define MaxVertexNum 10 /*定义最大顶点数*/
typedef int Vertex;/* 用顶点下标表示顶点,为整型 */
typedef struct{
int arcs[MaxVertexNum][MaxVertexNum]; /*邻接矩阵*/
int vexnum,arcnum; /*图中的顶点数vexnum和边数arcnum*/
}MGraph; /*用邻接矩阵表示的图的类型*/
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef enum
{
FALSE,
TRUE
} Boolean;
#define MaxVertexNum 10 /*定义最大顶点数*/
typedef int Vertex; /* 用顶点下标表示顶点,为整型 */
typedef struct
{
int arcs[MaxVertexNum][MaxVertexNum]; /*邻接矩阵*/
int vexnum, arcnum; /*图中的顶点数vexnum和边数arcnum*/
} MGraph; /*用邻接矩阵表示的图的类型*/
Boolean visited[MaxVertexNum]; /* 顶点的访问标记 */
void CreatMGraph(MGraph *G); /* 创建图并且将Visited初始化为false;裁判实现,细节不表 */
void BFS(MGraph G, Vertex v);
int main()
{
Vertex v;
MGraph G;
CreatMGraph(&G);
scanf("%d", &v);
printf("BFS from %d:", v);
BFS(G, v);
return 0;
}
/* 你的代码将被嵌在这里 */
对于给定图:
输入样例:
- 第一行给出图的顶点数
n
和边数e
,随后e
行,每行给出一条边的两个顶点编号,最后一行给出遍历的起始顶点编号。
7 9
0 2
0 3
0 4
1 3
1 5
2 3
2 5
4 5
5 6
5
输出样例:
BFS from 5: 5 1 2 4 6 3 0
AC:
void BFS(MGraph G, Vertex i)
{
int q[MaxVertexNum], front = 0, rear = 0; //定义一个数组队列
printf(" %d", i);
visited[i] = 1; //已经访问的做个标记1
q[rear++] = i; //第一个顶点进队列,尾指针后移
while (front != rear) //队列不为空
{
int now = q[front++]; //当前结点出队,用now记录进行操作
for (i = 0; i < G.vexnum; i++) //对所有结点操作
{
if (G.arcs[now][i] == 1 && visited[i] == 0) //如果他们是临界的,也就是这一行为1的,且没有被访问过,就访问它,再放入队列去
{
printf(" %d", i);
visited[i] = 1;
q[rear++] = i;
}
}
}
}