684冗長接続
この問題では、ツリーは、通信手段と非環式無向グラフです。
Nを有するノード(ノードの値が1を繰り返さない、2、...、N)と、1つの付加的なツリーエッジ構成から成るマップを入力します。1 Nの中間の頂点に含まれる2つの追加のエッジが、この追加のエッジが既にツリーエッジには存在しません。
図結果は、その側面に二次元アレイです。各側要素は、U <Vを満たす、[U、V]の組であり、uおよびvは、図の自由端に接続された頂点を表します。
戻り側は、結果がN個のノードを有する図ツリーであるように、省略することができます。、複数回答がある場合は、二次元配列の最後の発生が戻されます。回答エッジ[U、V]と同じフォーマットU <Vを満たすべきです。
例1:
输入: [[1,2], [1,3], [2,3]]
输出: [2,3]
解释: 给定的无向图为:
1
/ \
2 - 3
例2:
输入: [[1,2], [2,3], [3,4], [1,4], [1,5]]
输出: [1,4]
解释: 给定的无向图为:
5 - 1 - 2
| |
4 - 3
注意:
3から1000の入力二次元アレイのサイズ。
Nは、入力配列のサイズは1とNの間の整数の2次元配列。
アップデート(2017年9月26日):
私たちは、テストケースの再検討の問題と説明を持って、明確なグラフは無向グラフです。冗長に接続するためのIIは、図を参照してください。任意の不便のために、私たちは謝罪します。
class Solution {
int[] f;
boolean union(int a,int b){
int n=0;
//找a的父级
while(a!=f[a]){
a=f[a];
n++;
}
//找b的父级
while(b!=f[b]){
b=f[b];
n--;
}
//如果相等,就可以跳出了,
if(a==b){
return false;
}
//不相等,n>0说明a的深度高,就把a给f[b]
//反之,b的深度高,就把b给f[a]
if(n>0){
f[b]=a;
}else{
f[a]=b;
}
return true;
}
public int[] findRedundantConnection(int[][] edges) {
f=new int[edges.length+1];
for(int i=0;i<f.length;i++){
f[i]=i;
}
for(int[] e:edges){
if(!union(e[0],e[1])){
return e;
}
}
return new int[]{};
}
}