---
title: 1489. Find Critical and Pseudo-Critical Edges in Minimum Spanning Tree
tags: graph
description: share source code.
---
# 1489. Find Critical and Pseudo-Critical Edges in Minimum Spanning Tree
```java=
class Solution {
int root [] = new int [101];
int rank [] = new int [101];
int component = 0;
public void init(){
for(int i = 0; i < 101; i++){
root [i] = i;
rank [i] = 1;
}
component = 0;
}
public boolean isConnected(int u, int v){
return find(u) == find(v);
}
public void union(int u, int v){
int pu = find(u);
int pv = find(v);
if(rank[pu] < rank[pv]){
root [pu] = pv;
}else if(rank[pu] > rank[pv]){
root [pv] = pu;
}else{
root [pv] = pu;
rank [pu]++;
}
component++;
}
public int find(int u){
while(u != root[u]){
root[u] = root[root[u]];
u = root[u];
}
return u;
}
public List<List<Integer>> findCriticalAndPseudoCriticalEdges(int n, int[][] edges) {
int m = edges.length;
init();
Map<int[], Integer> map = new HashMap<>();
for(int i =0;i<edges.length;i++){
map.put(edges[i], i);
}
Arrays.sort(edges, (a, b) -> a[2] - b[2]);
int min_cost = 0;
int min_component = 0;
for(int edge [] : edges){
if(!isConnected(edge[0], edge[1])){
union(edge[0], edge[1]);
min_cost += edge[2];
min_component = component;
}
}
//System.out.println("min_cost: " + min_cost + " component " + component);
List<Integer> critical_edges = new ArrayList<>();
List<Integer> pseudo_edges = new ArrayList<>();
for(int i = 0; i < m; i++){
init();
int new_min_cost = 0;
int [] this_edge = edges[i];
for(int j = 0; j < m; j++){
if( i == j){
continue;
}
int [] edge = edges[j];
if(!isConnected(edge[0], edge[1])){
union(edge[0], edge[1]);
new_min_cost += edge[2];
}
}
if(new_min_cost == min_cost){
// check if it is in MST => must include this edge and doesn't increase min_cost
init();
// include this edge
union(this_edge[0], this_edge[1]);
// include this edge weight
new_min_cost = this_edge[2];
for(int edge [] : edges){
if(!isConnected(edge[0], edge[1])){
union(edge[0], edge[1]);
new_min_cost += edge[2];
}
}
//System.out.println("include edge " + i +" new_min_cost: " + new_min_cost+ " component " + component);
if(new_min_cost == min_cost)
pseudo_edges.add(map.get(this_edge));
}else if(new_min_cost > min_cost || min_component != component){
critical_edges.add(map.get(this_edge));
}
}
return Arrays.asList(critical_edges, pseudo_edges);
}
}
```