查找有向图中所有的环

Posted black-fish

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找有向图中所有的环相关的知识,希望对你有一定的参考价值。

在对每个结点进行DFS的基础上进行了一些优化。

优化原理:若findCycle(0,e), 找到一个0-2-3的环,那么不再对2、3进行findCycle()函数。因为2或3若是构成有其它的环,findCycle(0)回溯到2或3时,会找出这些环。


 1 import java.util.*;
 2 
 3 public class GetAllCyclesForDirectedGraph{
 4 static List<Integer> trace;
 5 static Set<Integer> searched=new HashSet<>();
 6 static Set<List<Integer>> allCircles = new HashSet<>();
 7 
 8 public static void main(String[] args) {
 9  int n=7; 
10 int[][] e={ {0,1,1,0,0,0,0}, {0,0,0,1,0,0,0}, 
11             {0,0,0,0,0,1,0}, {0,0,0,0,1,0,0}, 
12             {0,0,1,0,0,0,0}, {0,0,0,0,1,0,1}, 
13             {1,0,1,0,0,0,0}};
14 for(int i=0;i<n;i++){
15 if(searched.contains(i)) 
16 continue;
17 trace =new ArrayList<>();
18 findCycle(i,e); 
20 }
21 
22 for(List<Integer> list:allCircles)
23 System.out.println("circle: "+list);
24 }
25 
26 
27 static void findCycle(int v, int[][]e){
28 int j=trace.indexOf(v); 
29 if(j!=-1) {

31 List<Integer> circle=new ArrayList<>(); 32 while(j<trace.size()) {

34 searched.add(trace.get(j)); 35 circle.add(trace.get(j)); 36 j++; 37 } 39 Collections.sort(circle); allCircles.add(circle); 42 return; 43 } 44 45 46 trace.add(v); 47 for(int i=0;i<e.length;i++) { 48 if(e[v][i]==1){ 49 findCycle(i,e); 50 } 51 } 52 trace.remove(trace.size()-1); 53 } 54 55 }

 

 

 





以上是关于查找有向图中所有的环的主要内容,如果未能解决你的问题,请参考以下文章

Tree Operations 打印出有向图中的环

有向图和无向图的环检测

使用快速查找算法 (Java) 在有向图中查找所有弱连通分量的优化

[CF1491G]Switch and Flip

在给定多个顶点的情况下查找所有可能的有向图

codeforces Gym 101572 I 有向图最小环路径