【经典算法】:图的深度优先搜索与广度优先搜索的实现
来源:互联网 发布:视频同声翻译软件 编辑:程序博客网 时间:2024/05/29 04:36
非常简单,深度优先搜索可以用递归或者栈来实现,广度优先搜索用队列来实现,仅仅是数据结构换了一下而已,其他任何的东西都没有变。
实现样例代码:
#include<iostream>#include<queue>#include<stack>#include<stdlib.h>#define MAX 100using namespace std;typedef struct { int edges[MAX][MAX]; //邻接矩阵 int n; //顶点数 int e; //边数}MGraph;bool visited[MAX]; //标记顶点是否被访问过void creatMGraph(MGraph &G) //用引用作参数{ int i,j; int s,t; //存储顶点编号 int v; //存储边的权值 for(i=0;i<G.n;i++) //初始化 { for(j=0;j<G.n;j++) { G.edges[i][j]=0; } visited[i]=false; } for(i=0;i<G.e;i++) //对矩阵相邻的边赋权值 { scanf("%d %d %d",&s,&t,&v); //输入边的顶点编号以及权值 G.edges[s][t]=v; }}void DFS(MGraph G,int v) //深度优先搜索{ int i; printf("%d ",v); //访问结点v visited[v]=true; for(i=0;i<G.n;i++) //访问与v相邻的未被访问过的结点 { if(G.edges[v][i]!=0&&visited[i]==false) { DFS(G,i); } }}void DFS1(MGraph G,int v) //非递归实现{ stack<int> s; printf("%d ",v); //访问初始结点 visited[v]=true; s.push(v); //入栈 while(!s.empty()) { int i,j; i=s.top(); //取栈顶顶点 for(j=0;j<G.n;j++) //访问与顶点i相邻的顶点 { if(G.edges[i][j]!=0&&visited[j]==false) { printf("%d ",j); //访问 visited[j]=true; s.push(j); //访问完后入栈 break; //找到一个相邻未访问的顶点,访问之后则跳出循环 } } if(j==G.n) //如果与i相邻的顶点都被访问过,则将顶点i出栈 s.pop(); }}void BFS(MGraph G,int v) //广度优先搜索{ queue<int> Q; //STL模板中的queue printf("%d ",v); visited[v]=true; Q.push(v); while(!Q.empty()) { int i,j; i=Q.front(); //取队首顶点 Q.pop(); for(j=0;j<G.n;j++) //广度遍历 { if(G.edges[i][j]!=0&&visited[j]==false) { printf("%d ",j); visited[j]=true; Q.push(j); } } }}int main(void){ int n,e; //建立的图的顶点数和边数 while(scanf("%d %d",&n,&e)==2&&n>0) { MGraph G; G.n=n; G.e=e; creatMGraph(G); DFS(G,0); printf("\n"); // DFS1(G,0); // printf("\n"); // BFS(G,0); // printf("\n"); } return 0;}
阅读全文
0 0
- 【经典算法】:图的深度优先搜索与广度优先搜索的实现
- 广度优先搜索与深度优先搜索的 java 实现
- 图的基础算法-广度优先搜索/深度优先搜索
- 图的深度优先搜索与广度优先搜索
- 图的深度优先搜索与广度优先搜索
- 图的深度优先搜索与广度优先搜索
- 图的广度优先搜索与深度优先搜索
- 图的广度优先搜索与深度优先搜索
- DFS深度优先搜索算法与BFS广度优先搜索算法的java实现
- 【经典算法】图的深度优先搜索和广度优先搜索
- 图的遍历之深度优先搜索算法&&广度优先优先算法的实现
- 图的深度优先搜索和广度优先搜索算法、最小生成树两种算法 --C++实现
- 图的深度优先和广度优先搜索算法
- 图的深度优先与广度优先搜索
- 图的广度优先搜索算法实现
- 深度优先搜索、广度优先搜索的实现
- 深度优先搜索和广度优先搜索的代码实现
- 算法导论-图的搜索算法之深度优先搜索和广度优先搜索
- JSON字符串和java对象的互转
- 图片接口回调
- Java中,逻辑与& 和短路与&& 的区别
- 数据库加密之Xcode9.0后,sqlcipher加密:Implicit declaration of function ’sqlite3_key‘is invalid in C99问题
- Java对象的创建、访问和定位
- 【经典算法】:图的深度优先搜索与广度优先搜索的实现
- .net 反射访问私有变量和私有方法
- Animator事件
- PAT乙级题1002.写出这个数
- Popupwindow的简单使用
- 用阿里云独享虚拟主机搭建个人网站
- http客户端开发get、Post两种方式
- Android ALSA relevant adb commands
- JVM内存区域