数据结构之图的遍历(BFS+DFS)
2017-08-07 22:04
197 查看
//定义全局变量
//DFS:时间复杂度O(n*n)
//相当于树遍历中的前序遍历
//适合寻找目标明确,以找到目标为目的的情况
//BFS:时间复杂度O(n*n)
//相当于树遍历中的层次遍历
//适合在不断扩大遍历范围时找到相对最优解的情况
const int Maxnum=50; typedef int AdjMatrix[Maxnum][Maxnum];//定义边数组结构 typedef Struct { int vexnum,arcnum;//顶点数、边数 AdjMatrix arcs;//边数组 }Graph;//图 bool visited[Maxnum];//标记是否访问的数组
//DFS:时间复杂度O(n*n)
//相当于树遍历中的前序遍历
//适合寻找目标明确,以找到目标为目的的情况
void DFS(Graph &g, int v) { visited[v]=true;//从V开始访问,flag它 printf("%d",v);//打印v for(int j=0;j<g.vex.num;j++) { if(arcs[v][j]==1 && visited[j]==false)//这里可以获得V未访问过的邻接点 DFS(g,j);//递归调用,如果所有节点都被访问过,就回溯,而不再调用这里的DFS } } void DFSTraverse(Graph &g) { for(int i=0;i<g.vexnum;i++)//初始化访问数组 visited[i]=false; for(int i=0;i<g.vexnum;i++) { if(visited[i]==false)//从没有访问过的第一个元素来遍历图 DFS(g,i); } }
//BFS:时间复杂度O(n*n)
//相当于树遍历中的层次遍历
//适合在不断扩大遍历范围时找到相对最优解的情况
void(Graph &g) { for(int i=0;i<g.vexnum;i++)//初始化访问数组 visited[i]=false; queue<int> Q; for(int i=0;i<g.vexnum;i++) { if(visited[i]==false)//若该点没有访问 { visited[i]=true;//标记该点 Q.push(i);//将该点加入队列 while(!Q.empty())//只要队列不空,遍历就没有结束 { int t=Q.front();//取出队头元素 printf("%d",t);//打印t Q.pop(); for(int j=0;j<g.vexnum;j++) { if(arcs[t][j]==1 && visited[j]==false)//将其未访问过的邻接点加进入队列 { visited[j]==true;//在这里要设置true,因为这里该顶点我们已经加入到了队列,为了防止重复加入! Q.push(j); } } } } } }
相关文章推荐
- 数据结构(17)--图的遍历DFS和BFS
- 数据结构之图(邻接表存储,DFS和BFS遍历)
- 数据结构基础 图的遍历(三) 之 BFS+DFS(非递归实现)
- 【数据结构】图的遍历之DFS和BFS
- 基础数据结构算法_DFS and BFS
- 数据结构与C语言实现(九)——图(上):邻接表,DFS与BFS
- 数据结构基础 图的遍历(二) 之 BFS
- 【数据结构作业 链表 + BFS + DFS】
- 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)
- 图的遍历--使用邻接表作为存储结构的遍历(DFS、BFS)C语言
- 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)
- 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)
- [SDUT](2141)数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历 ---BFS(图)
- 数据结构基础 图的遍历(一) 之 DFS
- 数据结构小结(做一道题之前先想一下数据结构设计,然后向solve方法设计(bfs,dfs))
- 数据结构——图常用算法实现(DFS,BFS,最小生成树,最短路径,拓扑序列)
- rwkj 1501 数据结构:图的DFS遍历
- 数据结构基础(五)图以及DFS、BFS
- 数据结构 - 图的存储结构表示及其遍历 (DFS && BFS)
- SDUT_2015寒假集训_BFS&DFS_A-数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历