• 割边


    #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
    ",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;
    } 

    感谢《啊哈算法》!

  • 相关阅读:
    iPhone 调用Web Service 例子(转)
    iPhone开发:在UIAlertView中显示进度条(转)
    Oracel 分页
    NYOJ 477
    NYOJ 108(数组中存的是前n个数的和)
    NYOJ 199
    NYOJ 311(完全背包)
    高效斐数(前92位)
    NYOJ 57(6174问题)
    NYOJ 546(分珠宝)
  • 原文地址:https://www.cnblogs.com/dfsac/p/6819731.html
Copyright © 2020-2023  润新知