在本问题中, 树指的是一个连通且无环的无向图。
输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, …, N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。
结果图是一个以边组成的二维数组。每一个边的元素是一对[u, v] ,满足 u < v,表示连接顶点u 和v的无向图的边。
返回一条可以删去的边,使得结果图是一个有着N个节点的树。如果有多个答案,则返回二维数组中最后出现的边。答案边 [u, v] 应满足相同的格式 u < v。
- 这道题比II简单很多,并查集做,我们不断合并两条边,如果发现两个节点有共同的父亲的话说明他们形成一个环,那么这两个节点便是答案。
class Solution {
public static int[] fa;
public int find(int x){
return fa[x]==x?x:(fa[x]=find(fa[x]));
}
public static int[] res;
public void merge(int a,int b){
int x=find(a);
int y=find(b);
if(x!=y){
fa[x]=y;
}else{
res=new int[]{a,b};
}
}
public int[] findRedundantConnection(int[][] edges) {
if(edges==null||edges[0].length==0){
return new int[2];
}
res=null;
int n=edges.length;
fa=new int[n+1];
for(int i=1;i<=n;++i){
fa[i]=i;
}
for(int i=0;i<n;++i){
merge(edges[i][0],edges[i][1]);
if(res!=null){
return res;
}
}
return new int[2];
}
}