当前位置:   article > 正文

深度优先遍历 & 计算图的连通分量

基于深度优先搜索,设计算法,统计图中的连通分量个数

连通分量

  • 相当于森林中的有几棵树对应到图中的概念;
  • 连通分量是“树的个数”,是一个整数

用深度优先遍历计算图的连通分量代码实现

  • 数组 id 就像是并查集中用来存储元素的数组,存储的是每个节点所属的群体
  • id 数组的值做 GROUP BY 操作,就得到了这张图的连通分量
  • 连通分量由 ccount 保存;
  1. package bobo.algo;
  2. // 求无权图的联通分量
  3. public class Components {
  4. Graph G; // 图的引用
  5. private boolean[] visited; // 记录dfs的过程中节点是否被访问
  6. private int ccount; // 记录联通分量个数
  7. private int[] id; // 每个节点所对应的联通分量标记
  8. // 图的深度优先遍历
  9. void dfs( int v ){
  10. visited[v] = true;
  11. id[v] = ccount;
  12. for( int i: G.adj(v) ){
  13. if( !visited[i] )
  14. dfs(i);
  15. }
  16. }
  17. // 构造函数, 求出无权图的联通分量
  18. public Components(Graph graph){
  19. // 算法初始化
  20. G = graph;
  21. visited = new boolean[G.V()];
  22. id = new int[G.V()];
  23. ccount = 0;
  24. for( int i = 0 ; i < G.V() ; i ++ ){
  25. visited[i] = false;
  26. id[i] = -1;
  27. }
  28. // 求图的联通分量
  29. for( int i = 0 ; i < G.V() ; i ++ )
  30. if( !visited[i] ){
  31. dfs(i);
  32. ccount ++;
  33. }
  34. }
  35. // 返回图的联通分量个数
  36. int count(){
  37. return ccount;
  38. }
  39. // 查询点v和点w是否联通
  40. boolean isConnected( int v , int w ){
  41. assert v >= 0 && v < G.V();
  42. assert w >= 0 && w < G.V();
  43. return id[v] == id[w];
  44. }
  45. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/306133
推荐阅读
相关标签
  

闽ICP备14008679号