class Solution {
//查找(路径压缩版)
int find(int x){
if(x != parent[x])
parent[x] = find(parent[x]);
return parent[x];
}
//合并
void merge(int x,int y) {
parent[find(y)] = find(parent[x]);
}
int[] parent;
int[] count;
public int[] findRedundantDirectedConnection(int[][] edges) {
boolean conflict = false;
int u = -1;
parent = new int[edges.length+1];
count = new int[edges.length+1];
for (int i=0;i<parent.length;i++){
parent[i] = i;
}
for (int i=0;i<edges.length;i++){
count[edges[i][1]]++;
if(count[edges[i][1]]==2){
conflict = true;
u = edges[i][1];
}
}
if(!conflict){//如果不存在冲突,可以直接当做无环图处理
for (int i=0;i<edges.length;i++){
int x = edges[i][0];
int y = edges[i][1];
if(find(x)!=find(y)){
merge(x,y);
}else return edges[i];
}
}else {
int[][] tmp = new int[2][2];
int j = 0;
//若存在冲突,把冲突的两条边找出来
for (int i=0;i<edges.length;i++){
if(u==edges[i][1])
tmp[j++] = edges[i];
else merge(edges[i][0],edges[i][1]);
}
for (int i=0;i<2;i++){
int x = tmp[i][0];
int y = tmp[i][1];
//尝试添加一条边,若存在环,直接返回
if(find(x)==find(y))
return tmp[i];
else {
//若不存在,合并,然后尝试第二条边,也可不尝试直接返回
merge(x,y);
}
}
}
return null;
}
}
理清三种情况:1 有环无冲突,2 有冲突有环 3 有冲突无环 。然后按照三种情况编码即可