// To Hell and Back
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef pair<int, int> pii;
#define SZ(x) (int) x.size()
#define F first
#define S second
const int N = 1e5 + 10;
int ps[N], rt[N], S[N], from[N], to[N], P[9][N], H[N], n, m;
vector<int> adj[N]; map<pii, int> gd;
int Find(int v) {
return !rt[v] ? v : rt[v] = Find(rt[v]);
}
int LCA(int u, int v) {
if (H[u] < H[v]) swap(u, v);
for (int i = H[u] - H[v], j = 0; i; i /= 5, j++) {
while (i % 5) u = P[j][u], i--;
}
if (u == v) return u;
for (int i = 8; ~i; i--) {
for (int j = 0; j < 4; j++)
if (P[i][u] != P[i][v])
u = P[i][u], v = P[i][v];
}
return P[0][v];
}
void upd(int v, int p) {
P[0][v] = p; H[v] = H[p] + 1;
for (int i = 1; i < 9; i++) {
P[i][v] = P[i - 1][P[i - 1][P[i - 1][P[i - 1][P[i - 1][v]]]]];
}
for (int u : adj[v])
if (u != p) upd(u, v);
}
void DFS(int v, int p = -1) {
for (int u : adj[v])
if (u != p) {
DFS(u, v), ps[v] += ps[u];
if (ps[u]) gd[{u, v}] = gd[{v, u}] = 1;
ps[u] = 0;
}
}
void Union(int u, int v) {
int pu = Find(u), pv = Find(v);
if (pu == pv) {
ps[u]++, ps[v]++, ps[LCA(u, v)] -= 2;
} else {
if (S[pv] < S[pu]) swap(pu, pv), swap(u, v);
S[pv] += S[pu]; rt[pu] = pv;
DFS(pu), ps[pu] = 0;
adj[u].push_back(v), adj[v].push_back(u);
upd(u, v);
}
}
int main() {
fill(S, S + N, 1);
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++) {
int u, v; scanf("%d%d", &u, &v);
Union(u, v);
}
DFS(Find(1));
for (int i = 1; i <= n; i++) {
for (int u : adj[i])
if (u > i && !gd.count({u, i})) printf("%d %d\n", u, i);
}
return 0;
}
Compilation message
pipes.cpp: In function 'int main()':
pipes.cpp:68:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
68 | scanf("%d%d", &n, &m);
| ~~~~~^~~~~~~~~~~~~~~~
pipes.cpp:70:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
70 | int u, v; scanf("%d%d", &u, &v);
| ~~~~~^~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
3180 KB |
Output is correct |
2 |
Correct |
4 ms |
3180 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
14 ms |
4076 KB |
Output is correct |
2 |
Correct |
12 ms |
4076 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
240 ms |
4076 KB |
Output is correct |
2 |
Correct |
224 ms |
4076 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
440 ms |
5356 KB |
Output is correct |
2 |
Correct |
511 ms |
5612 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
763 ms |
8300 KB |
Output is correct |
2 |
Correct |
670 ms |
9580 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
1293 ms |
17640 KB |
Memory limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
2135 ms |
19740 KB |
Memory limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
3046 ms |
23680 KB |
Memory limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
3660 ms |
23364 KB |
Memory limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
4785 ms |
22768 KB |
Memory limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |