// Success consists of going from failure to failure without loss of enthusiasm
#include <bits/stdc++.h>
using namespace std;
#define nl '\n'
#define f first
#define s second
#define mp make_pair
#define pb push_back
using pi = pair<int, int>;
template<class T> using V = vector<T>;
struct DSU {
V<int> e; void init(int N) { e = V<int>(N, -1); }
int get(int x) { return e[x] < 0 ? x : e[x] = get(e[x]); }
bool sameSet(int x, int y) { return get(x) == get(y); }
bool unite(int x, int y) {
x = get(x), y = get(y);
if (x == y) return 0;
e[y] = x; return 1;
}
};
int main() {
cin.tie(0)->sync_with_stdio(0);
int N, M; cin >> N >> M;
V<V<int>> ADJ(N);
V<int> ID(N), SIZ(N), PAR(N), DEP(N);
DSU D; D.init(N); // for BCC
// ID and SIZ are part of the DSU
// while ADJ, PAR, DEP, and S store info about all the nodes
// of the spanning "tree" in its current state (AKA not necessarily connected and subject to change)
for(int i = 0; i < N; i++) {
ID[i] = i, SIZ[i] = 1;
PAR[i] = -1;
ADJ[i] = {};
}
int id = -1;
V<int> upd;
function<void(int)> dfs = [&](const int &u) {
if (PAR[u] != -1 && D.sameSet(PAR[u], u)) upd.pb(u);
for(auto &v : ADJ[u]) if (v != PAR[u]) {
assert(ID[v] == ID[u]);
PAR[v] = u, DEP[v] = DEP[u] + 1;
dfs(v);
}
ID[u] = id;
};
int xi, yi;
auto merge = [&](int x, int y) {
xi = ID[x], yi = ID[y]; if (xi == yi) return 0;
if (SIZ[xi] < SIZ[yi]) swap(xi, yi), swap(x, y);
// cout << xi << " " << yi << endl;
// yi is the smaller one
SIZ[xi] += SIZ[yi];
// RECOMPUTE PARENTS FOR yi AND CHANGE ID TO xi FOR EACH NODE
// ADD EDGE BETWEEN x AND y
PAR[y] = x;
DEP[y] = DEP[x] + 1;
id = xi;
dfs(y);
ADJ[x].pb(y); ADJ[y].pb(x);
for(auto &u : upd) D.e[u] = PAR[u];
upd = {};
return 1;
};
V<pair<int, int>> E;
int u, v, ui, vi;
for(int e = 0; e < M; e++) {
cin >> u >> v; u = u - 1, v = v - 1;
// if (!merge(u, v)) { // if not part of the spanning "tree"
// while(1) {
// ui = D.get(u), vi = D.get(v);
// // cout << u << " -> " << ui << endl;
// // cout << v << " -> " << vi << endl;
// if (ui == vi) break;
// if (DEP[ui] < DEP[vi]) swap(ui, vi);
// D.unite(PAR[ui], ui); // MAKE PAR[ui] the parent of ui
// }
// } else { // part of spanning "tree" (possible bridge)
// // cout << "ST: " << u << " <-> " << v << endl;
// E.pb({u, v});
// }
}
// for(auto& e : E) if (!D.sameSet(e.f, e.s)) {
// cout << e.f + 1 << " " << e.s + 1 << endl;
// }
return 0;
}
Compilation message
pipes.cpp: In function 'int main()':
pipes.cpp:61:7: warning: variable 'merge' set but not used [-Wunused-but-set-variable]
61 | auto merge = [&](int x, int y) {
| ^~~~~
pipes.cpp:90:12: warning: unused variable 'ui' [-Wunused-variable]
90 | int u, v, ui, vi;
| ^~
pipes.cpp:90:16: warning: unused variable 'vi' [-Wunused-variable]
90 | int u, v, ui, vi;
| ^~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
212 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
2 ms |
468 KB |
Wrong number of edges |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
60 ms |
340 KB |
Output is correct |
2 |
Incorrect |
58 ms |
340 KB |
Wrong number of edges |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
106 ms |
724 KB |
Output is correct |
2 |
Incorrect |
140 ms |
724 KB |
Wrong number of edges |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
168 ms |
1236 KB |
Output is correct |
2 |
Incorrect |
139 ms |
1492 KB |
Wrong number of edges |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
205 ms |
3324 KB |
Output is correct |
2 |
Incorrect |
187 ms |
3300 KB |
Wrong number of edges |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
319 ms |
3668 KB |
Output is correct |
2 |
Incorrect |
312 ms |
3732 KB |
Wrong number of edges |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
404 ms |
4568 KB |
Output is correct |
2 |
Incorrect |
391 ms |
4576 KB |
Wrong number of edges |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
535 ms |
4576 KB |
Output is correct |
2 |
Incorrect |
497 ms |
4580 KB |
Wrong number of edges |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
662 ms |
4368 KB |
Output is correct |
2 |
Incorrect |
636 ms |
4612 KB |
Wrong number of edges |
3 |
Halted |
0 ms |
0 KB |
- |