1class Solution {2int[] dsu;34public int[] findRedundantDirectedConnection(int[][] edges) {5int n = edges.length;6int[] parent = new int[n + 1];7Arrays.fill(parent, -1);89int[] e2 = null;10int[] e1 = null;11boolean twopt = false;1213for (int[] edge : edges) {1415int from = edge[0];16int to = edge[1];1718if (parent[to] == -1) {19parent[to] = from;20} else {21twopt = true;22e2 = edge;23e1 = new int[] {parent[to], to};24break;25}26}2728dsu = new int[edges.length + 1];29for (int i = 0; i <= edges.length; i++) {30dsu[i] = i;31}32if (twopt == false) {33int[] res = null;3435for (int[] edge : edges) {36int from = edge[0];37int to = edge[1];3839int fromlead = find(from);40if (fromlead == to) {41res = edge;42break;43} else {44dsu[to] = fromlead;45}46}47return res;48} else {49boolean iscycle = false;50for (int[] edge : edges) {51if (edge == e2) continue;52int from = edge[0];53int to = edge[1];5455int fromlead = find(from);5657if (fromlead == to) {58iscycle = true;59break;60} else {61dsu[to] = fromlead;62}63}64if (iscycle == true) {65return e1;66} else {67return e2;68}69}70}7172public int find(int x) {73if (dsu[x] == x) return x;74return dsu[x] = find(dsu[x]);75}76}