1
+ #include < bits/stdc++.h>
2
+ using namespace std ;
3
+
4
+ class Solution {
5
+ public:
6
+ vector<int > findRedundantDirectedConnection (vector<vector<int >>& edges) {
7
+ /* 进行统计 */
8
+ int E = edges.size ();
9
+ vector<int > counter (2 *E, 0 );
10
+ vector<vector<int >> idxs (2 *E, vector<int >()); // 记录边的位置
11
+ int target_node = -1 ; // 找两个入度的node
12
+ for (int i = 0 ; i < E; ++i) {
13
+ auto edge = edges[i];
14
+ counter[edge[1 ]]++;
15
+ idxs[edge[1 ]].push_back (i);
16
+ if (counter[edge[1 ]] == 2 ) {
17
+ target_node = edge[1 ];
18
+ break ;
19
+ }
20
+ }
21
+ // 判断, 是不是是环
22
+ if (target_node == -1 ) {
23
+
24
+ init_uf (2 *E);
25
+ for (int i = 0 ; i < E; ++i) {
26
+ auto edge = edges[i];
27
+ int first_root = find_uf (edge[0 ]);
28
+ int second_root = find_uf (edge[1 ]);
29
+ if (first_root == second_root) {
30
+ return edge; // 找到了环路的最后一个
31
+ }
32
+ parents[first_root] = second_root;
33
+ }
34
+ }
35
+ // printf("%d==%d,%d\n", target_node, idxs[target_node][0], idxs[target_node][1]);
36
+ // 如果不是环
37
+ vector<int > res;
38
+ for (int idx: idxs[target_node]) {
39
+ init_uf (2 *E);
40
+ int i = 0 ;
41
+ for (i = 0 ; i < E; ++i) {
42
+ if (i==idx) continue ;
43
+ auto edge = edges[i];
44
+ int first_root = find_uf (edge[0 ]);
45
+ int second_root = find_uf (edge[1 ]);
46
+ if (first_root == second_root) {
47
+ // 不是树
48
+ break ;
49
+ }
50
+ parents[first_root] = second_root;
51
+ }
52
+ if (i == E) {
53
+ res = edges[idx];
54
+ }
55
+ }
56
+ return res;
57
+
58
+ }
59
+ void init_uf (size_t n) {
60
+ parents.clear ();
61
+ auto it = back_insert_iterator (parents);
62
+ for (int i=0 ; i < n; ++i) it++ = i;
63
+ }
64
+ int find_uf (int x) {
65
+ int i;
66
+ for (i = x; i != parents[i]; i=parents[i]);
67
+ return i;
68
+ }
69
+
70
+ private:
71
+ vector<int > parents;
72
+ };
0 commit comments