图的BFS其实和树的BFS基本相同。它用来解决一些最短路问题。
思路和这篇文章中的基本相同:
http://blog.csdn.net/karry_zzj/article/details/68950898
还是贴一下怎么实现BFS吧!
如何实现BFS?
答:队列。试想一下队列的特点——FIFO(先进先出),ok,那么我们模拟一下结点入队出队的过程。
(1)创建一个空队列q;
(2)将结点1入队;队列状态为:1
(3)循环(下面的步骤都在这个循环里完成),条件是判断队列q是否为空,因为如果所有结点都不再入队即遍历完成;
(4)取队头结点赋给新结点V,然后出队,即结点1出队,目前队列为空,结点V就是结点1;队列状态为:NULL
(5)找到与V相邻的所有结点,即结点2和3,然后入队;队列状态为:2 3
(6)取队头元素,即结点2,赋给V,然后出队;队列状态为:3
(7)找到与V相邻的所有结点,即结点4和5,然后入队:队列状态为:3 4 5
(8)。。。。。不再赘述过程。
无权最短路径的代码如下:
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 1000;
const int INF = -1000;
int d[maxn]; //d[i]为从开始点到顶点i的最短距离
int metrix[maxn][maxn];//用邻接矩阵来实现图的构造,判断点与点连边很方便
int n,e; //n为顶点数,e为边数
/*读入数据*/
bool read()
{
memset(metrix,0,sizeof(metrix));
scanf("%d%d",&n,&e);
int x,y;
for(int i=0;i<e;i++)
{
scanf("%d%d",&x,&y);
metrix[x][y]=1;
}
}
/*宽度优先遍历*/
void bfs(int s)
{
queue<int>q; //用队列实现
q.push(s); //插入开始顶点
for(int i=0;i<n;i++)
{
d[i] = INF; //初始化为INF
}
d[s] = 0;
while(!q.empty())
{
int v = q.front(); q.pop();
for(int i=1;i<=n;i++)
{
if(metrix[v][i]&&d[i]==INF)
{
d[i] = d[v] + 1;
q.push(i);
}
}
}
}
int main()
{
if(read())
{
bfs(0);
for(int i=0;i<n;i++)
printf("%d ",d[i]);
}
return 0;
}