图—搜索——BFS

图的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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值