您的位置:首页 > 编程语言 > C语言/C++

图的遍历之BFS广度优先遍历C++实现

2015-04-14 22:01 686 查看
首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问他们相邻的未被访问过的顶点,直到所有顶点都被访问过,遍历结束。

广度优先遍历更加适用于所有边的权值相同的情况



#include<iostream>
#include<queue>
using namespace std;
int main()
{
int points,edgs;
cin>>points>>edgs;
int p1,p2;
int flag[10];
int edg[10][10];
int infinity=99999999;
for (int i=1;i<=points;i++)
{
for (int j=1;j<=points;j++)
{
if (i==j)
{
edg[i][j]=0;
}
else

{
edg[i][j]=infinity;
}
}
}
for (i=1;i<=edgs;i++)
{
cin>>p1>>p2;
edg[p1][p2]=1;
edg[p2][p1]=1;
flag[i]=0;
}
flag[1]=1;
int cur;
int qi[10];
int head=1;
int tail=1;
qi[tail]=1;
tail++;
while (head<tail)
{
cur=qi[head];
for (i=1;i<=points;i++)
{
if (edg[cur][i]==1&&flag[i]==0)//如果访问到起始点的相邻点,则相邻点入对
{							  //一轮结束再从相邻点寻找其相邻点直到所有点访问结束
qi[tail]=i;
tail++;
flag[i]=1;
}
if (tail>points)
{
break;
}
}
head++;
}
for (i=1;i<tail;i++)
{
cout<<qi[i]<<" ";
}
cout<<endl;
}
输出结果:



图的广度优先遍历应用——最少转机:1号城市坐飞机到5号城市,希望找到一种乘坐方式,使得转机的次数最少。



#include<iostream>
#include<queue>
using namespace std;
struct note
{
int number;
int count;
};
int main()
{
int points,edgs;
cin>>points>>edgs;
int start,end;
cin>>start>>end;
int p1,p2;
int flag[10];
int edg[10][10];
int infinity=99999999;
for (int i=1;i<=points;i++)
{
for (int j=1;j<=points;j++)
{
if (i==j)
{
edg[i][j]=0;
}
else

{
edg[i][j]=infinity;
}
}
}
for (i=1;i<=edgs;i++)
{
cin>>p1>>p2;
edg[p1][p2]=1;
edg[p2][p1]=1;
flag[i]=0;
}
flag[1]=1;
int cur;
struct note qi[10];
int head=1;
int tail=1;
qi[tail].number=start;
qi[tail].count=0;
tail++;
int f=0;
while (head<tail)
{
cur=qi[head].number;
for (i=1;i<=points;i++)
{
if (edg[cur][i]==1&&flag[i]==0)//如果访问到起始点的相邻点,则相邻点入对
{							  //一轮结束再从相邻点寻找其相邻点<span style="white-space:pre">										</span>  //直到所有点访问结束
qi[tail].number=i;
qi[tail].count=qi[head].count+1;
tail++;
flag[i]=1;
}
if (qi[tail-1].number==end)//因为tail指的是队列末位的下一位所以判断要减1得出末尾的前一位
{
f=1;
break;
}
}
if (f==1)
{
break;
}
head++;
}

cout<<qi[tail-1].count<<endl;
}
输出结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: