又是一个模板题…
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int SIZE=100010;
int head[SIZE],nxt[SIZE],tot=0;
struct edge{
int f,t;
}l[SIZE],ans[SIZE];
bool cmp(edge a,edge b)
{
if(a.f!=b.f) return a.f<b.f;
return a.t<b.t;
}
void build(int f,int t)
{
l[++tot].t=t;
l[tot].f=f;
nxt[tot]=head[f];
head[f]=tot;
}
int low[SIZE],dfn[SIZE],dfs_clock=0;
bool qiao[SIZE];
void dfs(int u,int fa)
{
dfn[u]=low[u]=++dfs_clock;
for(int i=head[u];i;i=nxt[i])
{
int v=l[i].t;
if(!dfn[v])
{
dfs(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u]) qiao[i]=1;
}
else if(dfn[v]<dfn[u]&&v!=fa)
{
low[u]=min(low[u],dfn[v]);
}
}
}
int n,m;
bool maps[233][233];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
build(a,b); build(b,a);
maps[a][b]++; maps[b][a]++;
}
for(int i=1;i<=n;i++)
if(!dfn[i])
dfs(i,0);
int cnt=0;
for(int i=1;i<=tot;i++)
{
if(qiao[i])
{
if(l[i].f>l[i].t) swap(l[i].f,l[i].t);
if(maps[l[i].f][l[i].t]==1)
ans[++cnt]=l[i];
}
}
sort(ans+1,ans+1+cnt,cmp);
for(int i=1;i<=cnt;i++)
{
if(ans[i].f==ans[i-1].f&&ans[i].t==ans[i-1].t)
continue;
printf("%d %d\n",ans[i].f,ans[i].t);
}
return 0;
}