图的深度优先搜索(DFS)、广度优先搜索(BFS)
2013-08-24 16:07
465 查看
深度优先搜索(DFS)、广度优先搜索(BFS)
图的邻接矩阵形式
图的邻接矩阵形式
#include <iostream> #include <queue> #include <stack> #define MAX 100 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; } } std::cout << "输入边的顶点编号和权值:" << std::endl; for(i = 0; i < G.e; i ++) //对矩阵相邻的边赋权值 { std::cin >> s >> t >> v; //输入边的顶点编号以及权值 G.edges[s][t] = v; } } //深度优先搜索递归实现 void DFS(MGraph G, int v) { int i; std::cout << 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) { std::stack<int> s; std::cout << 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) { std::cout << j << " "; //访问 visited[j] = true; s.push(j); //访问完后入栈 break; //找到一个相邻未访问的顶点,访问之后则跳出循环 } } if(j == G.n) //如果与i相邻的顶点都被访问过,则将顶点i出栈 s.pop(); } } //广度优先搜索,借助于队列 void BFS(MGraph G, int v) { std::queue<int> Q; //STL模板中的queue std::cout << 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) { std::cout << j << " "; visited[j] = true; Q.push(j); } } } } int main() { int n, e; //建立的图的顶点数和边数 while(1) { std::cout << "请输入建立的图的顶点数n和边数e:"<< std::endl; std::cin >> n >> e; MGraph G; G.n = n; G.e = e; CreatMGraph(G); int i; //深度优先搜索递归 for(i = 0; i < G.n; i ++) //初始化 { visited[i] = false; } std::cout << "深度优先搜索(递归)的顶点顺序:" << std::endl; DFS(G,0); for(i = 0; i < G.n; i ++) { if(visited[i] == false) DFS(G,i); } std::cout << std::endl; //深度优先搜索非递归 for(i = 0; i < G.n; i ++) //重新初始化 { visited[i] = false; } std::cout << "深度优先搜索(非递归)的顶点顺序:" << std::endl; for(i = 0; i < G.n; i ++) { if(visited[i] == false) DFS1(G,i); } std::cout << std::endl; //广度优先搜索 for(i = 0; i < G.n; i ++) //重新初始化 { visited[i] = false; } std::cout << "广度优先搜索的顶点顺序:" << std::endl; for(i = 0; i < G.n; i ++) { if(visited[i] == false) BFS(G,i); } std::cout << std::endl; } return 0; }
相关文章推荐
- 深度优先搜索(DFS)&广度优先搜索(BFS)
- leetcode:深度优先搜索(DFS)和广度优先搜索(BFS)
- 图的基本算法--深度优先搜索(dfs) 和 广度优先搜索(bfs)
- 图的 深度优先搜索(DFS) 以及 广度优先搜索(BFS)
- 二叉树 深度优先搜索(DFS)、广度优先搜索(BFS)
- DFS(深度优先搜索)与BFS(广度优先搜索)
- 深度优先搜索(DFS)与广度优先搜索(BFS)
- 深度优先搜索(DFS),广度优先搜索(BFS)
- HDU 4707 Pet(DFS(深度优先搜索)+BFS(广度优先搜索))
- 二叉树 深度优先搜索(DFS)、广度优先搜索(BFS)
- 二叉树 深度优先搜索(DFS)、广度优先搜索(BFS)
- 图的深度优先搜索(DFS)和广度优先搜索(BFS)
- 深度优先搜索(DFS)与广度优先搜索(BFS)
- 关于图的广度优先搜索(BFS)和深度优先搜索(DFS)
- 图的深度优先搜索(DFS),广度优先搜索(BFS)与最小生成树(MST)
- HDU 1241 Oil Deposits DFS(深度优先搜索) 和 BFS(广度优先搜索)
- 图(邻接表)的遍历——DFS(深度优先搜索)和BFS(广度优先搜索)和连通图
- 图的广度优先搜索(BFS)、深度优先搜索(DFS)(邻接矩阵法和邻接表法java实现)
- 简单DFS(深度优先搜索)和BFS(广度优先搜索)学习积累
- HDU 1312 Red and Black DFS(深度优先搜索) 和 BFS(广度优先搜索)