classSolution { public: staticconstint N = 1010; int f[N], degree[N]; int n;
vector<int> findRedundantDirectedConnection(vector<vector<int>>& edges){ n = edges.size(); memset(degree, 0, sizeof degree); for (auto e : edges) ++degree[e[1]]; for (int i = n-1; i >= 0; --i) { if (degree[edges[i][1]] == 2 && !wrongEdge(edges, i).size()) { return edges[i]; } } returnwrongEdge(edges, n); }
vector<int> wrongEdge(vector<vector<int>>& edges, int except){ init(); for (int i = 0; i < n; ++i) { if (i == except) continue; int u = edges[i][0], v = edges[i][1]; if (same(u, v)) return edges[i]; join(u, v); } return {}; }
voidinit(){ for (int i = 1; i <= n; ++i) { f[i] = i; } }
intfind(int u){ return u==f[u] ? u : f[u]=find(f[u]); }
voidjoin(int u, int v){ u = find(u); v = find(v); if (u == v) return; f[v] = u; }
boolsame(int u, int v){ u = find(u); v = find(v); return u == v; } };
python
classSolution: deffindRedundantDirectedConnection(self, edges: List[List[int]]) -> List[int]: self.n = len(edges) degree = [0] * (self.n+1) for u, v in edges: degree[v] += 1 for u, v in edges[::-1]: if degree[v] == 2andlen(self.wrongEdge(edges, [u, v])) == 0: return [u, v] returnself.wrongEdge(edges, [])
defwrongEdge(self, edges, ex): self.f = [i for i inrange(self.n+1)] for u, v in edges: if [u, v] == ex: continue ifself.same(u, v): return [u, v] self.join(u, v) return []
deffind(self, u): if u == self.f[u]: return u self.f[u] = self.find(self.f[u]) returnself.f[u]
defjoin(self, u, v): u, v = self.find(u), self.find(v) if u == v: return self.f[v] = u
defsame(self, u, v): u, v = self.find(u), self.find(v) return u == v