图的遍历之-DFS深度优先遍历C++实现
2015-04-14 20:27
246 查看
深度优先遍历的思想:
沿着图的某一个分支遍历直到末端,然后回溯,再沿着另一条进行同样的遍历,直到所有的顶点都被访问过为止:首先以一个未被访问过的顶点作为起始顶点,沿着当前顶点的边走未访问过的顶点;当没有未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问过。
求出上图各个顶点到各个顶点的路径
找出图中1号城市到5号城市的最短距离
设有n个点,e条边
邻接矩阵:矩阵包含n^2个元素,在算法中,共n个顶点,对每个顶点都要遍历n次,所以时间复杂度为O(n^2)
邻接表:包含n个头结点和e个表结点,算法中对所有结点都要遍历一次,所以时间复杂度为
O(n+e)
对于广度优先算法的时间复杂度,也是这样
沿着图的某一个分支遍历直到末端,然后回溯,再沿着另一条进行同样的遍历,直到所有的顶点都被访问过为止:首先以一个未被访问过的顶点作为起始顶点,沿着当前顶点的边走未访问过的顶点;当没有未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问过。
求出上图各个顶点到各个顶点的路径
#include<iostream> using namespace std; int count=0; int points,edgs; int p1,p2; int edg[10][10]; int infinity=99999999; int flag[10]; void Dfs(int cur) { cout<<cur<<" "; count++; if (count==points) { return ; } for (int i=1;i<=points;i++) { if (edg[cur][i]==1&&flag[i]==0) { flag[i]=1; Dfs(i); } } return ; } int main() { cin>>points>>edgs; 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; } for (int k=1;k<=points;k++) { for (i=1;i<=points;i++) { flag[i]=0; } flag[k]=1; Dfs(k); count=0; cout<<endl; } }输出结果:
找出图中1号城市到5号城市的最短距离
<span style="font-size:18px;">#include<iostream> using namespace std; int count=0; int points,edgs; int destination; int p1,p2; int edg[10][10]; int infinity=99999999; int flag[10]; int w; int min=infinity; void Dfs(int cur,int dis) { if (dis>min) { return; } if (cur==destination)//判断当前位置是否为目标城市 { if (dis<min) { min=dis; } return ; } //每次递归邻接边按照相邻的顺序 //1-2-3-4-5 1-2-5 1-5按照此顺序反复递归 for (int i=1;i<=points;i++) //从1号城市到points依次尝试 { if (edg[cur][i]!=infinity&&flag[i]==0)//满足有路径想通和为走过才执行 { flag[i]=1;//标记城市i已经在路径中 Dfs(i,dis+edg[cur][i]);//从城市i再出发,继续寻找目标城市 flag[i]=0;//之前一步探索完毕后,取消对城市i的标记 } } return ; } int main() { cin>>destination>>points>>edgs; 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>>w; edg[p1][p2]=w; } flag[1]=1; Dfs(1,0); cout<<min<<endl; }</span>输出结果:
设有n个点,e条边
邻接矩阵:矩阵包含n^2个元素,在算法中,共n个顶点,对每个顶点都要遍历n次,所以时间复杂度为O(n^2)
邻接表:包含n个头结点和e个表结点,算法中对所有结点都要遍历一次,所以时间复杂度为
O(n+e)
对于广度优先算法的时间复杂度,也是这样
相关文章推荐
- 图的深度优先和广度优先遍历(图以邻接表表示,由C++面向对象实现)
- 数据结构之图---深度优先遍历---C++实现
- 深度优先遍历 DFS C实现
- C++实现图的广度优先遍历与深度优先遍历
- leetcode 526. Beautiful Arrangement 递归实现全排列 + 经典深度优先遍历DFS做法
- BFS_DFS深度广度优先C++实现。
- 第12周项目3-(1)图遍历算法实现、实现深度优先遍历—DFS
- 第十二周项目3--图遍历算法实现--实现深度优先遍历--DFS
- 第12周—项目3(1) 图遍历算法—实现深度优先遍历——DFS
- C++实现图的邻接矩阵存储和广度、深度优先遍历实例分析
- 第十二周项目三 图遍历算法实现——深度优先(DFS)遍历
- 图的深度优先遍历DFS (邻接矩阵实现) c语言
- C/C++代码实现图(有向图)的深度,广度优先遍历
- 深度优先遍历DFS(C++)
- leetcode 547. Friend Circles 寻找图的环的数量 + 典型的深度优先遍历DFS
- leetcode 97. Interleaving String(字符串交错出现) DFS深度优先遍历 + 很明显很经典的DP动态规划做法
- 图的邻接表存储 深度优先遍历 广度优先遍历 C语言实现
- 图的俩种遍历方式(DFS,BFS)C++代码实现
- (c++)二叉树的广度优先遍历和深度优先遍历
- 邻接矩阵深度优先和广度优先遍历(DFS和BFS)