割边

来源:互联网 发布:程序员伪造工作经验 编辑:程序博客网 时间:2024/05/01 15:55
#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;}
1 0
原创粉丝点击