#include <bits/stdc++.h>
//#pragma GCC optimize ("O3")
//#pragma GCC target ("sse4")
#pragma GCC target ("avx,tune=native")
//Use above if bruteforcing with lots of small operations. Or just use it anytime, there's no downside. AVX is better slightly
/*
TASK: hidden
LANG: C++11
*/
using namespace std;
typedef long long ll;
typedef pair<int, int> pair2;
typedef pair<int, pair<int, int> > pair3;
typedef pair<int, pair<int, pair<int, int> > > pair4;
#define MAXN 30013
#define INF 1000000000000000000LL
#define mp make_pair
#define add push_back
#define remove pop
int n, m;
vector<short> adj[MAXN];
vector<pair<short, short>> answer;
short depth[MAXN], lowestAdjDepth[MAXN];
//returns subtree size
void solve(int current, int parent) {
assert(depth[current] >= 1);
lowestAdjDepth[current] = depth[current];
for (int next : adj[current]) {
if (next == parent) continue;
if (lowestAdjDepth[next] >= 1) {
lowestAdjDepth[current] = min(lowestAdjDepth[current], depth[next]);
} else {
//unvisited, let's go visit!
depth[next] = depth[current] + 1;
solve(next, current);
lowestAdjDepth[current] = min(lowestAdjDepth[current], lowestAdjDepth[next]);
if (lowestAdjDepth[next] > depth[current]) {
//the next node is in a biconnected component unaffected by current node
answer.add(mp(next, current));
}
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m;
for (int i = 0; i < m; i++) {
int a, b;
cin >> a >> b;
a--;b--;
adj[a].add(b);
adj[b].add(a);
}
for (int i = 0; i < n; i++) {
if (depth[i] == 0) {
depth[i] = 1;
solve(i, -1);
}
}
for (auto t : answer) {
cout << t.first + 1 << ' ' << t.second + 1<< endl;
}
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
1024 KB |
Output is correct |
2 |
Incorrect |
3 ms |
1024 KB |
Wrong number of edges |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
1536 KB |
Output is correct |
2 |
Incorrect |
6 ms |
1280 KB |
Wrong number of edges |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
134 ms |
5320 KB |
Output is correct |
2 |
Correct |
129 ms |
4780 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
245 ms |
7376 KB |
Output is correct |
2 |
Correct |
277 ms |
9236 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
481 ms |
13688 KB |
Output is correct |
2 |
Correct |
369 ms |
11900 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
4 ms |
1920 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
3 ms |
1920 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
3 ms |
1920 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
4 ms |
1920 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
4 ms |
1920 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
2 |
Halted |
0 ms |
0 KB |
- |