#include <bits/stdc++.h>
using namespace std;
const int nx=1e5+5;
int n, m, u, v, sz[nx], dsu1[nx], dsu2[nx], low[nx], disc[nx], t, rt;
vector<int> d[nx];
int find1(int x)
{
if (dsu1[x]==x) return x;
return dsu1[x]=find1(dsu1[x]);
}
int find2(int x)
{
if (dsu2[x]==x) return x;
return dsu2[x]=find2(dsu2[x]);
}
void dfs(int u, int p)
{
low[u]=disc[u]=++t;
for (auto v:d[u])
{
if (v==p) continue;
if (!disc[v]) dfs(v, u), low[u]=min(low[u], low[v]);
else low[u]=min(low[u], disc[v]);
}
if (low[u]==disc[u]&&u!=rt) cout<<u<<' '<<p<<'\n';
}
int main()
{
cin.tie(NULL)->sync_with_stdio(false);
cin>>n>>m;
for (int i=1; i<=n ;i++) dsu1[i]=dsu2[i]=i;
for (int i=1; i<=m; i++)
{
cin>>u>>v;
if (find1(u)!=find1(v))
{
dsu1[find1(u)]=find1(v);
d[u].push_back(v);
d[v].push_back(u);
}
else if (find2(u)!=find2(v))
{
dsu2[find2(u)]=find2(v);
d[u].push_back(v);
d[v].push_back(u);
}
}
for (int i=1; i<=n; i++) if (!disc[i]) rt=i, dfs(i, i);
}
# | 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... |