Skip to content

Commit 6b48b23

Browse files
committed
684 685
1 parent 77dd2bd commit 6b48b23

File tree

2 files changed

+104
-0
lines changed

2 files changed

+104
-0
lines changed

cpp/684.cpp

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
4+
class Solution {
5+
public:
6+
vector<int> findRedundantConnection(vector<vector<int>>& edges) {
7+
vector<int> res{0, 0};
8+
init_uf(2*edges.size());
9+
for (vector<int>& edge:edges) {
10+
int first_root = find_uf(edge[0]);
11+
int second_root = find_uf(edge[1]);
12+
if (first_root == second_root) {
13+
res = edge; // copy assign
14+
continue;
15+
}
16+
parents[first_root] = second_root;
17+
}
18+
return res;
19+
}
20+
void init_uf(size_t n) {
21+
auto it = back_insert_iterator(parents);
22+
for (int i=0; i < n; ++i) it++ = i;
23+
}
24+
int find_uf(int x) {
25+
int i;
26+
for (i = x; i != parents[i]; i=parents[i]);
27+
return i;
28+
}
29+
30+
private:
31+
vector<int> parents;
32+
};

cpp/685.cpp

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
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

Comments
 (0)