知识点
广度优先搜索
- 将起点s放入到队列Q中
- 只要Q不为空,就循环执行下述处理
- 从Q中取出顶点u进行访问
- 将与u相邻的未访问结点v放入到Q中
问题链接
ALDS1_11_C:Breadth First Search
问题内容
求顶点1到其他点的最短路径长度,如果不能达到则输出-1
思路
利用广度优先搜索,当访问u的边时,将d[v]更新为d[u]+1,则可以记录最短路径长度
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxx = 110;
int n, m[maxx][maxx];
int u, num, v;
int flag[maxx];
int d[maxx];
void bfs() {
queue<int>q;
q.push(1);
d[1] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = 2; i <= n; i++) {
if (m[u][i] == 1 && flag[i] == 0) {
// 标记为已经访问
flag[i] = 1;
// 更新长度
d[i] = d[u] + 1;
// 压入栈内
q.push(i);
}
}
}
}
int main()
{
scanf("%d", &n);
memset(m, 0, sizeof(m));
for (int i = 1; i <= n; i++) {
scanf("%d %d", &u, &num);
// 初始化
flag[i] = 0;
d[i] = -1;
for (int j = 1; j <= num; j++) {
scanf("%d", &v);
m[u][v] = 1;
}
}
bfs();
for (int i = 1; i <= n; i++) {
printf("%d %d\n", i, d[i]);
}
return 0;
}