#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
using namespace std;
// #define int long long
#define ld long double
#define ll long long
#define pii pair <int, int>
#define pb push_back
#define fi first
#define se second
#define lc id * 2 + 0
#define rc id * 2 + 1
#define migmig ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
const int maxn = 2e5 + 100;
const int inf = 1e9;
const int mod = 1e9 + 7;
const int lg = 20;
int n, m;
int sz1[maxn], par1[maxn];
int sz2[maxn], par2[maxn];
vector <pii> ans;
vector <int> g[maxn];
bool vis[maxn];
int h[maxn], ps[maxn], par[maxn];
int find1(int u){
return par1[u] == u ? u : par1[u] = find1(par1[u]);
}
int find2(int u){
return par2[u] == u ? u : par2[u] = find2(par2[u]);
}
bool Union1(int u, int v){
u = find1(u), v = find1(v);
if (u == v)
return 0;
if (sz1[u] < sz1[v])
swap(u, v);
sz1[u] += sz1[v];
par1[v] = u;
return 1;
}
bool Union2(int u, int v){
u = find2(u), v = find2(v);
if (u == v)
return 0;
if (sz2[u] < sz2[v])
swap(u, v);
sz2[u] += sz2[v];
par2[v] = u;
return 1;
}
void DFS(int u){
vis[u] = 1;
for (auto v : g[u]){
if (v == par[u])
continue;
if (vis[v]){
if (h[u] > h[v]){
ps[u] ++;
ps[v] --;
}
continue;
}
par[v] = u;
h[v] = h[u] + 1;
DFS(v);
ps[u] += ps[v];
}
}
void solve(){
cin >> n >> m;
for (int i = 1 ; i <= n ; i ++){
par1[i] = par2[i] = i;
sz1[i] = sz2[i] = 1;
}
for (int i = 1 ; i <= m ; i ++){
int u, v;
cin >> u >> v;
if (Union1(u, v)){
g[u].pb(v);
g[v].pb(u);
}
else if (Union2(u, v)){
g[u].pb(v);
g[v].pb(u);
}
}
for (int i = 1 ; i <= n ; i ++)
if (!vis[i])
DFS(i);
for (int i = 1 ; i <= n ; i ++){
if (par[i] == 0)
continue;
if (ps[i] == 0)
ans.pb({i, par[i]});
}
for (auto [u, v] : ans)
cout << u << ' ' << v << '\n';
}
int32_t main(){ migmig;
int tt = 1;
// cin >> tt;
while (tt--)
solve();
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |