图的广度优先遍历
我一直觉得图的遍历没有地图类型的题目难,遍历嘛,每个点都走一遍就行了。
但是给定地图求面积啊,数量啊的那种题目,花样挺多的。
图的遍历真挺难把人绕晕的,关于广度优先,理解好层层递进这个概念就好。
- 还是这张图,上次我用了深度优先方法去遍历它:图的深度优先遍历
- 这次用广度优先(BFS)法去遍历它
代码实现
#include<stdio.h>
int book[2000], a[2000][2000], que[2000];
int sum, n, m;
int head, tail;
int main()
{
int i, j, m, x, y;
int cur;
scanf("%d %d", &n, &m);
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
if (i == j)
a[i][j] = 0;
else
a[i][j] = 99999999;
for (i = 1; i <= m; i++)
{
scanf("%d %d", &x, &y);
a[x][y] = 1;
a[y][x] = 1;
}
head = 1;
tail = 1;
que[tail] = 1;
book[1] = 1;
tail++;
while (head < tail)
{
//当前正在访问的顶点的编号
cur = que[head];
// 从1~n进行尝试
for (i = 1; i <= n; i++)
{
if (a[cur][i] == 1 && book[i] == 0)
{
que[tail] = i;
tail++;
book[i] = 1;
}
//如果tail>n则表示所有顶点都被访问过
if (tail > n)
{
break;
}
}
//这里不要忘记,拓展完之后,要将头指针+1
head++;
}
for (i = 1; i < tail; i++)
{
printf("%d ", que[i]);
}
return 0;
}
遍历结果为