当前位置:   article > 正文

寻找 有向图/无向图 所有环路的DFS暴力求解法(ps:C++代码,复杂度爆炸警告,生产环境慎用)_有向无环图 代码证明

有向无环图 代码证明

思路:

1、DFS算法可以求解图中从一点到另一点的全部路径。

2、通过枚举所有顶点Vi的邻接点vi,然后通过DFS寻找枚举点viVi的所有路径来寻找环路。

3、思路很简单,但是算法复杂度确实是太高了。

下面上代码:

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. const int M = 100;
  6. int n, e, G[M][M];
  7. bool vis[M];
  8. //初始化图
  9. void initGraph() {
  10. cin >> n >> e;
  11. int ti, tj;
  12. for (int i = 0; i < e; i++) {
  13. cin >> ti >> tj;
  14. G[ti][tj] = 1;
  15. }
  16. }
  17. vector<vector<int>> finalResult; //存储最终的所有找到的环
  18. vector<int> path; //dfs路径栈
  19. //判断两个无序的vector内元素是否完全一样
  20. bool isSame(vector<int> v1,vector<int> v2) {
  21. if (v1.size() != v2.size()) {
  22. return false;
  23. } else {
  24. sort(v1.begin(),v1.end());
  25. sort(v2.begin(),v2.end());
  26. return v1==v2;
  27. }
  28. }
  29. //判断t在finalResult是否已经存在
  30. bool isExist(vector<int> &t) {
  31. for (int i = 0; i < finalResult.size(); i++) {
  32. if (isSame(finalResult[i], t)) {
  33. return true;
  34. }
  35. }
  36. return false;
  37. }
  38. //打印路径
  39. void printPath(int &begin) {
  40. cout << begin << " ";
  41. for (int i = 0; i < path.size(); i++) {
  42. cout << path[i] << " ";
  43. }
  44. cout << endl;
  45. }
  46. //dfs寻找起点s到终点d的全部路径
  47. void dfs(int s, int d,int &begin) {
  48. if (s==d) {
  49. path.push_back(s);
  50. if (path.size() > 2 && !isExist(path)) {
  51. printPath(begin);
  52. finalResult.push_back(path);
  53. }
  54. path.pop_back();
  55. vis[s] = false;
  56. return;
  57. }
  58. vis[s] = true;
  59. path.push_back(s);
  60. for (int i = 0; i < n; i++) {
  61. if (!vis[i] && G[s][i]==1) {
  62. dfs(i,d,begin);
  63. }
  64. }
  65. vis[s] = false;
  66. path.pop_back();
  67. }
  68. //调用dfs函数寻找该图的所有环路
  69. void findAllCircle() {
  70. for (int i = 0; i < n; i++) {
  71. for (int j = 0; j < n; j++) {
  72. if (G[i][j]==1) {
  73. dfs(j, i, i);
  74. fill(vis, vis + n, false);
  75. path.clear();
  76. }
  77. }
  78. }
  79. }
  80. int main() {
  81. initGraph();
  82. findAllCircle();
  83. return 0;
  84. }

---测试用例---

格式:

顶点数n [空格] 边数e
边1的出点 [空格] 边1的入点
边2的出点 [空格] 边2的入点
边3的出点 [空格] 边3的入点
...
边e的出点 [空格] 边e的入点

输入:(有向图)

  1. 6 7
  2. 0 1
  3. 0 2
  4. 2 3
  5. 2 4
  6. 3 4
  7. 4 0
  8. 1 5

输出:

无向图修改一下建图代码即可。

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

闽ICP备14008679号