-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path684.redundantConnection.kruskal.java
64 lines (57 loc) · 1.53 KB
/
684.redundantConnection.kruskal.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
class Solution {
public int[] findRedundantConnection(int[][] edges) {
// graph contain mst+ 1 edge
// do kruskal and track which edge is taken
// return edge which is not taken
// if all edges are taken, return empty array
int max=0;
for(int[] ed:edges)max=Math.max(ed[1],Math.max(max,ed[0])); //find maximum node-index
DSU dj=new DSU(max); //create disjoint set
boolean taken[]=new boolean[max+1];
for(int i=0;i<edges.length;i++){
int []edge=edges[i];
int src=edge[0],des=edge[1];
if(dj.find(src)!=dj.find(des)){
dj.union(src,des);
taken[i]=true;
}
}
for(int i=0;i<=max;i++){
if(taken[i]==false){
return edges[i];
}
}
return new int[]{};
}
}
class DSU{
int parent[];
int size[];
DSU(int n){
parent=new int[n+1];
size=new int[n+1];
for(int i=0;i<=n;i++){
parent[i]=i;
size[i]=1;
}
}
void union(int i,int j){
int ui=find(i);
int uj=find(j);
int ui_size=size[ui];
int uj_size=size[uj];
if(ui==uj)return;
if(ui_size>uj_size){
parent[uj]=ui;
size[ui]+=uj_size;
}else{
parent[ui]=uj;
size[uj]+=ui_size;
}
}
int find(int i){
if(parent[i]==i)return i;
parent[i]=find(parent[i]);
return parent[i];
}
}