当前位置:   article > 正文

【算法】有向图最大环数+有向图找环+C实例_求有向图环的个数

求有向图环的个数

有向图如下

要求找出最大环中节点的个数,比如0-1-2-3-4构成一个环,0-1构成一个环,1-2也是一个环

其中0-1-2-3-4是最大环,环数为5
 


visit数组表示当前点的状态 

0 表示还没访问过

1 表示正在访问

-1 表示访问结束

 

递归遍历的实现

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. vector<vector<int>> map;//邻接矩阵
  5. vector<int> visit;// 状态数组
  6. vector<int> path;//环的元素
  7. int v, e;
  8. int m = 0;
  9. int max = 0;
  10. void dfs(int k) {
  11. visit[k] = 1;
  12. path[m++] = k;
  13. for (int i = 0; i < v; i++) {
  14. if (map[k][i] == 1) {
  15. if (visit[i] == 0) {
  16. dfs(i);
  17. }
  18. if (visit[i] == 1) {
  19. cout << "环:";
  20. int cnt = 0;
  21. for (int j = m - 1;; j--) {
  22. cout << path[j] << ' ';
  23. cnt++;
  24. if (path[j] == i) {
  25. break;
  26. }
  27. }
  28. cout << endl;
  29. if (cnt > max) {
  30. max = cnt;
  31. }
  32. }
  33. //if (visit[i] == 0) {
  34. // continue;
  35. //}
  36. }
  37. }
  38. visit[k] = -1;
  39. m--;
  40. }
  41. int main() {
  42. while (cin >> v >> e) {
  43. vector<vector<int>>(v, vector<int>(v, 0)).swap(map);
  44. vector<int>(v, 0).swap(visit);
  45. vector<int>(v, 0).swap(path);
  46. for (int i = 1; i <= e; i++) {
  47. int a, b;
  48. cin >> a >> b;
  49. map[a][b] = 1;
  50. }
  51. cout << endl;
  52. for (int i = 0; i < v; i++) {
  53. for (int j = 0; j < v; j++) {
  54. cout << map[i][j] << " ";
  55. }
  56. cout << endl;
  57. }
  58. cout << endl;
  59. for (int i = 0; i < v; i++) {
  60. if (visit[i] != -1)
  61. dfs(i);
  62. }
  63. cout << max << endl;
  64. max = 0;
  65. }
  66. return 0;
  67. }

 

 

  1. 5 8
  2. 0 1
  3. 1 0
  4. 1 2
  5. 2 1
  6. 2 3
  7. 3 4
  8. 4 3
  9. 4 0
  10. 0 1 0 0 0
  11. 1 0 1 0 0
  12. 0 1 0 1 0
  13. 0 0 0 0 1
  14. 1 0 0 1 0
  15. 环:1 0
  16. 环:2 1
  17. 环:4 3 2 1 0
  18. 环:4 3
  19. 5

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/64543
推荐阅读
相关标签
  

闽ICP备14008679号