ALDS1_11_C:Breadth First Search
题目:
https://cn.vjudge.net/problem/Aizu-ALDS1_11_C
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define MAX 105
#define NIL -1
int a[MAX][MAX],d[MAX];
int n;
void bfs(int s)
{
int v;
for(int i = 0;i < n;i++) d[i] = NIL;
queue<int> q;
q.push(s);
d[s] = 0;
while(!q.empty())
{
v = q.front();
q.pop();
for(int i = 0;i < n;i++)
{
if(d[i] != NIL) continue;
if(a[v][i] == 1)
{
q.push(i);
d[i] = d[v] + 1;
}
}
}
}
int main()
{
int u,k,v;
scanf("%d",&n);
for(int i = 0;i < n;i++)
{
scanf("%d%d",&u,&k);
u--;
for(int j = 0;j < k;j++)
{
scanf("%d",&v);
v--;
a[u][v] = 1;
}
}
bfs(0);
for(int i = 0;i < n;i++) cout << i + 1 << " " << d[i] << endl;
return 0;
}
此题考查的是BFS算法,先来简单介绍一下BFS算法,先把最开始的结点放入队列中,然后将这个结点相邻的结点也放入队列中,当把这个结点的所有相邻结点都放入队列后,这个结点就可以出队了(因为此时这个结点已经没有可能访问到其他新的相邻的结点了),随后将队列中第一个元素的相邻结点放入队列,然后这个结点再出队…就一直执行这个操作直到队列为空,这个时候图中所有的结点都已经被访问过了。
本题还要求求起点到各个结点的距离,首先开始时将起点的距离标记为0,因为起点到它本身的距离就是0,然后每次有新元素入队就将距离加一(这里针对的是无权图)。这样就可以求出起点到其他各点的最短距离了。
使用邻接矩阵实现的广度优先算法中,程序要调查每个顶点是否与其他所有顶点相邻,因此复杂度是o(v^2),不适用于规模较大的图。