如题
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll M=2e4+5;
ll n,m,low[M],num[M],ans,dfn,root=1;
vector<ll>v[M];
struct node
{
ll a1,a2;
}a[M];
bool cmp(node x,node y)
{
return (x.a1==y.a1?x.a2<y.a2:x.a1<y.a1);
}
void dfs(ll k,ll fa)
{
low[k]=num[k]=++dfn;
for(int i=0;i<v[k].size();i++)
{
ll x=v[k][i];
if(!num[x])
{
dfs(x,k);
low[k]=min(low[k],low[x]);
if(low[x]>num[k]&&k!=root)
{
a[++ans].a1=min(k,x);
a[ans].a2=max(k,x);
}
}
else if(num[x]<num[k]&&x!=fa)
{
low[k]=min(low[k],num[x]);
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
ll x,y;
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
for(int i=1;i<=n;i++)
{
if(!num[i])
{
root=i;
dfs(i,i);
}
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=ans;i++)
{
cout<<a[i].a1<<" "<<a[i].a2<<endl;
}
return 0;
}