割边

来源:互联网 发布:淘宝好友在哪里看 编辑:程序博客网 时间:2024/05/01 16:05
#include<iostream>#include<cstring>#include<cstdio>#include<string>#include<algorithm>#include<queue>#include<vector>using namespace std;int num[200009],dfn[100009],nxt[200009],low[100009],head[100009],dfs_num=0,cnt=0,root;int n,m;bool flag[100009];void dfs(int cur,int father){    dfn[cur]=++dfs_num;    low[cur]=dfs_num;    for(int i=head[cur];i;i=nxt[i])    {        int u=num[i];        if(!dfn[u])        {            dfs(u,cur);            low[cur]=min(low[u],low[cur]);            if(low[u]>dfn[cur])//满足此条件就代表不能回到(不经过来的路)父亲节点,说明只有一条来的路径,那么这两个点之间就是一条割边            {                printf("%d--%d\n",cur,u);            }        }        else         {            if(u!=father)            {                low[cur]=min(low[cur],dfn[u]);            }        }    }}int main(){    freopen("a.in","r",stdin);    scanf("%d%d",&n,&m);    for(int i=1;i<=m;i++)    {        int x,y;        scanf("%d%d",&x,&y);        num[++cnt]=y;        nxt[cnt]=head[x];        head[x]=cnt;        num[++cnt]=x;        nxt[cnt]=head[y];        head[y]=cnt;    }    for(int i=1;i<=n;i++)    {        if(!dfn[i])         {            root=i;            dfs(i,root);        }    }    return 0;} 

感谢《啊哈算法》!

0 0
原创粉丝点击