图的遍历

来源:互联网 发布:皮影客动画软件下载 编辑:程序博客网 时间: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;}