#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);
const int N = (int)1e5+1;
int n1[N], n2[N];
int r1[N], r2[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 fin1(int x){
while(n1[x] != x) x=n1[x];
return x;
}
int fin2(int x){
while(n2[x] != x) x=n2[x];
return x;
}
bool merg1(int a, int b){
a=fin1(a);
b=fin1(b);
if(a==b) return false;
if(r1[a] > r1[b])
swap(a,b);
r1[b]+=r1[a];
n1[a]=b;
return true;
}
bool merg2(int a, int b){
a=fin2(a);
b=fin2(b);
if(a==b) return false;
if(r2[a] > r2[b])
swap(a,b);
r2[b]+=r2[a];
n2[a]=b;
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;
r1[i] = 1, r2[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 |
6144 KB |
Output is correct |
2 |
Correct |
7 ms |
6244 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
9 ms |
6272 KB |
Output is correct |
2 |
Correct |
10 ms |
6272 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
122 ms |
6252 KB |
Output is correct |
2 |
Correct |
116 ms |
6264 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
202 ms |
6508 KB |
Output is correct |
2 |
Correct |
240 ms |
6264 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
329 ms |
6892 KB |
Output is correct |
2 |
Correct |
285 ms |
6648 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
480 ms |
8432 KB |
Output is correct |
2 |
Correct |
432 ms |
6504 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
735 ms |
8808 KB |
Output is correct |
2 |
Correct |
711 ms |
7544 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
997 ms |
9464 KB |
Output is correct |
2 |
Correct |
922 ms |
6648 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1303 ms |
9452 KB |
Output is correct |
2 |
Correct |
1225 ms |
6648 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1847 ms |
9204 KB |
Output is correct |
2 |
Correct |
1471 ms |
7796 KB |
Output is correct |