图的遍历
来源:互联网 发布:皮影客动画软件下载 编辑:程序博客网 时间:2024/06/14 03:31
连通图:
在无向图G中,如果从顶点v到v'有路径,则称v和v'是连通的。如果对图中任意两点,都是连通的,那么则称图G是连通图。
在有向图G中,如果对于任意一对,vi、vj(不相等),从vi到vj,和从vj到vi都存在路径,则称G是强连通图。
图的遍历:希望从图中某一顶点出发访便图中其余顶点。
注意:如果,从某一点出发,可以遍历所有的顶点,前提就是图的连通性。对于无向图,必须是连通图;对于有向图,必须是强连通图。
广度优先遍历逻辑:放入队列的是还没处理过的顶点,所谓的处理就是针对该顶点指向的其他顶点的操作。
1、将遍历开始的顶点访问标识置为true,压入队列。
2、如果队列不为空,获取队列最前端顶点,弹出该顶点。
3、遍历该顶点指向的顶点,若没有被访问,将其访问标识置为true,压入队列。(一定要注意,在入队列前,要置为true)
4、循环步骤2、3直至队列为空。
#include<iostream> #include<vector> #include<list>#include<queue>using namespace std;typedef struct edge //边结构{int weight; //边权重char adjver; //边指向的顶点}edge;typedef struct vertex{char ver; //顶点存放的元素list<edge> edgelis; //顶点发出边的链表}vertex;typedef struct graph{int vertexNum; //图中顶点个数vector<vertex> verlis; //图中顶点数组vector<bool> vist; //辅助图的遍历void init() //主要是对vist初始化{for (int i = 0; i < vertexNum; i++){vist[i] = false;verlis[i].ver = 'A' + i;}}graph(){vertexNum = 0;}graph(int num) //构造函数{vertexNum = num;verlis.resize(num);vist.resize(num);init(); //针对vist数组进行初始化}void addedge(char ver1, char ver2, int weight) //往图中添加边,记住建立的是有向图{edge temp1;temp1.adjver = ver2;temp1.weight = weight;verlis[(ver1 - 'A')].edgelis.push_back(temp1);}void dfs(char a) //深度优先遍历{//if (vist[a - 'A']) return; //可以去掉cout << a << " ";vist[a - 'A'] = true;list<edge>::iterator it = verlis[a - 'A'].edgelis.begin();while (it != verlis[a - 'A'].edgelis.end() && !vist[(it->adjver - 'A')]){dfs(it->adjver);it++;}}void bfs(char a) //广度优先遍历的逻辑是{queue<char> que;vist[a - 'A'] = true; //压入栈之前,一定要将访问标识为trueque.push(a);while (!que.empty()){char temp = que.front();que.pop();cout << temp << " ";list<edge>::iterator it = verlis[temp - 'A'].edgelis.begin();while (it != verlis[temp - 'A'].edgelis.end()){if (!vist[(it->adjver - 'A')]){vist[(it->adjver - 'A')] = true; //压入栈之前,一定要将访问标识为trueque.push(it->adjver);}it++;}}}void DFS(){for (int i = 0; i < vertexNum; i++){if (!vist[i]){dfs(verlis[i].ver);}}init(); //针对vist数组进行恢复}void BFS(){for (int i = 0; i < vertexNum; i++){if (!vist[i]){bfs(verlis[i].ver);}}init();}}graph;int main(){char input[15][2] = { { 'A', 'B' }, { 'A', 'F' }, { 'G', 'F' }, { 'B', 'G' }, { 'B', 'C' }, { 'B', 'I' }, { 'C', 'I' }, { 'G', 'D' }, { 'G', 'H' }, { 'F', 'E' }, { 'H', 'E' }, { 'D', 'E' }, { 'H', 'D' }, { 'I', 'D' }, { 'C', 'D' } };graph g(9);for (int i = 0; i < 15; i++){g.addedge(input[i][0], input[i][1], 1);g.addedge(input[i][1], input[i][0], 1);}g.DFS();cout << endl;g.BFS();system("pause");return 0;}
阅读全文
0 0
- 图:图的遍历(深度优先遍历、广度优先遍历)
- java图的遍历方式(深度遍历、广度遍历)
- java图的遍历方式(深度遍历、广度遍历)
- 图的遍历(深度遍历和广度遍历)
- 图的遍历:深度优先遍历和广度优先遍历
- 图的 深度遍历 广度遍历
- 图的深度遍历和广度遍历
- 图的遍历(深度优先遍历)
- 图的遍历:深度优先遍历
- 图的遍历:宽度优先遍历
- 图的广度遍历和深度遍历
- 图的深度遍历和广度遍历
- 图的遍历-深度优先遍历
- 图的遍历-广度优先遍历
- 图的dfs遍历和bfs遍历
- 图的深度遍历和广度遍历
- 图的遍历算法-马遍历棋盘
- 图的遍历算法-马遍历棋盘
- H5 用户注册页面
- 六、STL的数值计算---数组(向量)运算---gslice类和gslice_array类模板
- 微信小程序商店域名由wxapp.dreawer.com永久更换为:store.dreawer.com
- 事件分发的几个主要方法与其返回值的意义
- javascript中escape()、unescape()、encodeURI()、encodeURIComponent()、decodeURI()、decodeURIComponent()比较
- 图的遍历
- 六、STL的数值计算---数组(向量)运算---mask_array类
- 网易笔试在线编程_ 操作序列
- Oracle学习笔记day02——用户
- 为ElasticSearch添加HTTP基本认证(head,bigdesk等插件增加登陆机制)
- cent os 挂盘
- Java之HashMap学习
- Linux文本编辑器
- C#之异常处理