#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define fi first
#define se second
#define mp make_pair
#define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
mt19937 rnd(chrono::steady_clock().now().time_since_epoch().count());
const int N = (int)1e5+1;
int n1[N], n2[N];
int tin[N], low[N];
int nd[4 * N], pv[4 * N];
int las[N];
int timer;
int cnt;
void add(int a, int b){ // a -> b
nd[cnt]=b;
pv[cnt]=las[a];
las[a]=cnt;
cnt ++ ;
}
void EDGE(int a, int b){
add(a,b);
add(b,a);
}
int lasp;
int fin1(int x){
lasp = x;
while(x!=n1[x]){
x=n1[x];
n1[lasp]=x;
lasp=x;
}
return x;
}
int fin2(int x){
lasp = x;
while(x!=n2[x]){
x=n2[x];
n2[lasp]=x;
lasp=x;
}
return x;
}
bool merg1(int a, int b){
a=fin1(a);
b=fin1(b);
if(a==b) return false;
if((int)rnd()%2)n1[a]=b;
else n1[b] = a;
return true;
}
bool merg2(int a, int b){
a=fin2(a);
b=fin2(b);
if(a==b) return false;
if((int)rnd()%2)n2[a]=b;
else n2[b]=a;
return true;
}
void Init(){
for(int i = 0 ; i < N ; i ++ ){
n1[i] = i, n2[i] = i;
tin[i] = -1, low[i] = -1;
las[i] = -1;
}
for(int i = 0 ; i < 4 * N ; i ++ ){
nd[i] = -1;
pv[i] = -1;
}
}
void dfs(int node, int par){
tin[node] = timer ++ ;
low[node] = tin[node];
for(int j = las[node] ; j != -1 ; j = pv[j]){
if(nd[j] == par){
continue;
}
if(tin[nd[j]] != -1){
low[node] = min(low[node], tin[nd[j]]);
}
else{
dfs(nd[j], node);
low[node] = min(low[node], low[nd[j]]);
if(tin[node] < low[nd[j]] && fin2(node) != fin2(nd[j])){
cout << node << " " << nd[j] << "\n";
}
}
}
}
int main(){
fastIO;
Init();
int n, m;
cin >> n >> m;
int u, v;
for(int i = 0 ; i < m ; i ++ ){
cin >> u >> v;
if(merg1(u,v))
EDGE(u, v);
else if(merg2(u,v))
EDGE(u, v);
}
for(int i =1 ; i <= n; i ++ )
if(tin[i] == -1) dfs(i,-1);
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
6 ms |
5376 KB |
Output is correct |
2 |
Correct |
6 ms |
5376 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
29 ms |
5496 KB |
Output is correct |
2 |
Correct |
14 ms |
5480 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2486 ms |
5472 KB |
Output is correct |
2 |
Correct |
445 ms |
5468 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5062 ms |
5376 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5062 ms |
5424 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5063 ms |
5552 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5052 ms |
5504 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5068 ms |
5376 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5061 ms |
5376 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5069 ms |
5376 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |