#include <cstdio>
#include <iostream>
using namespace std;
int dfn[199999],low[199999],n,m,root;
int num;
int f[199999];
int head[199999],to[199999],net[199999],cnt;
void add(int x,int y)
{
cnt++;
to[cnt]=y;
net[cnt]=head[x];
head[x]=cnt;
}
int dfs(int x,int fat)
{
int c=0;
dfn[x]=++num;
low[x]=num;
for(int i=head[x];i;i=net[i])
{
int tmp=to[i];
if(!dfn[tmp])//当这个点没被访问过
{
c++;
dfs(tmp,x);
low[x]=min(low[tmp],low[x]);
if(x!=root&&low[tmp]>dfn[x])
printf("%d-%d\n",x,tmp);//当这个点删去跟父亲的边时,这个点连父亲都到不了时,这个点与父节点之间的边即为割边
}
else
{
if(tmp!=fat)
{
low[x]=min(low[x],dfn[tmp]);//这个拓展点不是x的父亲时更新x的low值
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
int ans=0;
for(int i=1;i<=n;i++)
if(!dfn[i])//遍历整张图
{
root=i;
dfs(i,i);
}
return 0;
}
割边
最新推荐文章于 2022-08-14 22:29:36 发布