关于BFS的小节

来源:互联网 发布:win7恢复网络设置方法 编辑:程序博客网 时间:2024/06/05 01:06

BFS(广度优先搜索)的一些微小的应用

关于BFS

按照本蒟蒻自己的理解广度优先搜索(以下称BFS)是一种基于层数的搜索方式,相较于深度优先搜索(以下称DFS),BFS的搜索方式更类似于辐射状而不是DFS一样的线性搜索。所以在实际的运用中,BFS在最短路问题以及覆盖面积一类的问题中有着非常大的优势。以下写出一道BFS在最短路问题的应用。


FZOJ 1431: BFS找最短路

题目描述
下图表示的是从城市A到城市H的交通图。从图中可以看出,从城市A到城市H要经过若干个城市。现给给出一个城市的路线图,并给出起点与终点,请给出最短的路线。
样例图示!
输入
第一行三个数,分别是起点城市,目标城市,线路条数n。
接下来n行,每行两个数字,表示这两个城市之间有线路。
注意:输入数据中1表示城市A,2表示城市B……(你应该知道数据范围了吧?)
输出
输出路线一行,用->表示箭头,具体格式见样例。
样例输入
1 8 12
1 2
1 3
1 4
1 6
2 6
3 4
3 5
4 7
5 7
5 8
6 8
7 8
样例输出
A->F->H


解题思路

首先思考DFS的可行性,根据深度优先的原则,我们会优先搜索当前节点可以到达的下一个节点,直到搜索到目标节点,返回长度值。粗略计算可得算法复杂度会在O(n^k)(n代表城市数,k代表每个城市连接几个城市)左右。本题数据范围较小滑天下之大稽,如果剪枝得当,也许可以AC,由于本蒟蒻相当之懒,剪枝技能炒鸡辣鸡,所以DFS算法就不在这里多赘述了。
关于本题BFS的优势就体现在,BFS搜索方式是*按层搜索一层一层逐步搜索,所以搜索到结果时,必定是最短路。粗略计算了一下,算法复杂度会在O(nk)左右,比起DFS复杂度的指数级增长,这个复杂度感觉相当良心有木有?

甩出代码

由于本蒟蒻异常喜欢写SPFA,导致写BFS时经常写的很像SPFA滑天下之大稽,各位大佬、巨佬、神犇、巨友(这是什么鬼??)见谅……

#include<cstdio>#include<cstring>#include<algorithm>#include<queue>//对于懒的人,就要用懒的STLusing namespace std;const int MAXN=27;queue <int> s[MAXN];//强行用队列来存矩阵(表示对链表深恶痛绝)queue <int> que;bool vis[MAXN];//dist是距离,last_point是存储上一个点的由来int dist[MAXN],last_point[MAXN],n,a,b,u,point,Start,End;void search(int a){//使用递归的方式寻找路径    if(a==Start){        printf("%c",Start+'A'-1);        return;    }    search(last_point[a]);    printf("->%c",a+'A'-1);    return;}int main(){    memset(vis,0,sizeof vis);    memset(dist,126/3,sizeof dist);    scanf("%d%d%d",&Start,&End,&n);    for(int i=1;i<=n;i++){        scanf("%d%d",&a,&b);        s[a].push(b);        s[b].push(a);    }    //广度优先搜索    que.push(Start);    vis[Start]=true;    dist[Start]=0;    while(!que.empty()){        u=que.front();        vis[u]=false;        que.pop();        n=s[u].size();        for(int i=1;i<=n;i++){            point=s[u].front();            s[u].pop();            if(dist[point]>dist[u]+1){                dist[point]=dist[u]+1;                last_point[point]=u;                if(!vis[point]){                    vis[point]=true;                    que.push(point);                }            }        }    }    search(End);}

咳咳,代码果然很丑,看来还是要提高志几的恣肆水平……就这样吧!写的很烂,不要介意!滑天下之大稽


THE END

2 0
原创粉丝点击