通过DFS和BFS判断无向图是否连通
2017-11-27 22:18
239 查看
基础定义
无向图:没有方向的图连通图:任意两个顶点可以直接或者通过其他顶点走通,那么就是连通图,和完全图需要区别(完全图是需要任意两个顶点直接有路)
遍历图的基本方法来判断是否连通
DFS和BFS有的步骤都是从一个顶点开始,然后判断该顶点是否被访问,而且该顶点和其他顶点是否有关系,若有关系并且没有访问过,就往下访问,要是无向图是连通的,那么这个过程会依次下去遍历所有节点。所以通过这个特性,就可以设置一个全局变量count去记录,看最后count的值和顶点数是否相同,若相同则说明是无向连通图,反之则不是。int count = 0; void DFS(MGrap G. int i) { int j = 0; visited[i] = 1; count++; for(j=0; j<G.numVertexes; j++) { if(G.arc[i][j]==1 && !visited[j])//i和j有关系相邻,并且j顶点没有被访问过 { DFS(G, j); } } }
int count = 0; void BFS(MGrap G) { int i,j; Queue Q; for(i=0; i<G.numVertexes; i++)/*初始化访问数组*/ { visited[i] = -1; } InitQueue(&Q); for(i=0; i<G.numVertexes; i++) { if(!visited[i]) { visited[i] = 1; printf("%c",G.vexs[i]); EnQueue(&Q,i);/*入队操作*/ while(!QueueEmpty(Q)) { DeQueue(&Q, &i); for(j=0; j<G.numVertexes; j++) { /* 判断当前的节点与其他节点的关系 */ if(G.arc[i][j]==1 && !visited[j]) { if(i==0)/*首先遍历的节如果和其他边有关系的话要加上*/ { count++; } visited[j] = 1; count++; EnQueue(&Q,j); } } } } } }
PS:这个代码是自己想着加的,也不知道对不对。若果不对,希望小伙伴们帮我指出来。
相关文章推荐
- 邻接矩阵 有向图 判断是否有环 是否连通 DFS C实现~
- K - Strange Country II 暴力dfs判断有向图是否连通//lxm
- hdu 4514 并查集判断无向图是否有环+树(无环连通图)的直径(两次bfs)
- bfs----判断无向简单图中任意两点是否连通
- BFS/DFS 判断是否是二分图
- C++ 读取文件中的数字 并存放到vector中 在由vector存放到 multimap中 最后BFS 判断是否连通
- EOJ 1816 判断图连通的三种方法——dfs,bfs,并查集
- POJ2762判断图是否单向连通,缩点+dfs
- 通过BFS 和 DFS两种方法找无向图的连通分量
- Android之通过ActivityLifecycleCallbacks判断程序是否运行在后台
- 通过JS来判断页面控件是否获取焦点
- 3478 Catch (判断是否为二分图,dfs奇偶染色)
- BFS判断是否是二分图Bipartite算法
- PHP通过HTTP_USER_AGENT判断是否为手机移动终端的函数
- 图结构练习——BFSDFS——判断可达性
- 使用InternetGetConnectedState这个API判断网络是否连通
- Android通过获取Ip的方法判断手机是否联网
- 通过HttpServletRequest判断客户端浏览器类型是否为IE11
- android 判断网络是否连接 通过NetworkInfo
- 通过Jquery判断页面元素是否在浏览器的可视区域内