图的遍历之BFS广度优先遍历C++实现
2015-04-14 22:01
686 查看
首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问他们相邻的未被访问过的顶点,直到所有顶点都被访问过,遍历结束。
广度优先遍历更加适用于所有边的权值相同的情况
图的广度优先遍历应用——最少转机:1号城市坐飞机到5号城市,希望找到一种乘坐方式,使得转机的次数最少。
广度优先遍历更加适用于所有边的权值相同的情况
#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; }输出结果:
相关文章推荐
- 【第十一周项目3】图遍历算法实现(2)广度优先遍历(BFS)
- 如何实现广度优先遍历(BFS)
- 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]
- 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]
- 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]
- 怎样实现广度优先遍历(BFS)
- C/C++代码实现图(有向图)的深度,广度优先遍历
- 利用广度优先遍历BreadthFirstSearch (BFS)实现两个点之间是否连通
- 算法学习 - 图的广度优先遍历(BFS) (C++)
- 第十二周 项目3-图遍历算法实现 (2)广度优先遍历(BFS)
- 第十二周项目3--图遍历算法实现--实现广度优先遍历——BFS
- 邻接表实现--图的深度优先遍历DFS和广度优先遍历BFS
- 邻接矩阵实现--图的深度优先遍历DFS和广度优先遍历BFS
- 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]
- 算法学习 - 图的广度优先遍历(BFS) (C++)
- C++模板实现二叉查找树(四 广度优先遍历)
- C++非递归队列实现二叉树的广度优先遍历
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]
- C++模板实现二叉查找树(四 广度优先遍历)