private static final int UNIVISITED = 0;
private static final int VISITING = 1;
private static final int VISITED = 2;
//尽量不要用global变量
private Integer markNode = -1; //看看有没有入度为2的点
int[] possibleResult = new int[]{-1, -1};
public int[] findRedundantConnection(int[][] edges) {
if (edges == null. || edges.length == 0) {
return new int[]{-1, -1};
}
int[] indegree = new int[edges.length + 1];
Map<Integer, Map<Integer, Integer>> graph = buildGraph(edges, indegree);
int[] visited = new int[edges.length + 1];
List<Integer> path = new ArrayList<>();
int[] cycle = null;
if (markNode != -1) {
int startNode = -1;
for (int i = 1; i < indgree.length; i++) {
if (indegree[i] == 0) {
startNode = i;
}
}
cycle = DFS(graph, startNode, visited, path);
} else {
//当不存在indegree为2的点的时候,无法确定root
for (int i = 1; i < edges.length; i++) {
cycle = DFS(graph, visited,path);
if (result != null) {
break;
}
};
}
if (cycle == null) {
return possibleResult; //是一个怎么样的边?造成indegree为2的边
} else {
return cycle;
}
}
private int[] findEdge(List<Integer> cycle, Map<Integer, Map<Integer, Map<Integer, Integer>>> graph) {
int startNode = cycle.get(cycle.size() - 1);
int[] result = new int[]{cycle.get(cycle.size() -2), cycle.get(cycle.size() - 1)};
if (startNode.equals(markedNode)) {
return result;
}
int index = cycle.size() - 2;
while (index - 1 >= 0 && cycle.get(index) != startNode) {
int u = cycle.get(index - 1);
int v = cycle.get(index);
if (v.equals(markNode)) {
return new int[]{u, v};
}
if (graph.get(result[0]).get(result[1]) < graph.get(u).get(v)) {
result[0] = u;
result[1] = v;
}
index--;
}
return result;
}
private Map<Integer, Map<Integer, Integer>> = buildGraph(int[][] edges, int[] indegree) {
Map<Integer, Map<Integer, Integer>> graph = new HashMap<>();
for (int i = 0; i < edges.length; i++) {
int u = edges[i][0];
int v = edges[i][1];
indegree[v]++;
if (indegree[v] == 2) {
markNode = v;
}
graph.putIfAbsent(u, new HashMap<>());
graph.get(u).put(v, i);
}
return graph;
}