• poj3177边-双连通分量


    题意和poj3352一样。。唯一区别就是有重边,预先判断一下就好了

    #include<map>
    #include<set>
    #include<list>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define fi first
    #define se second
    #define mp make_pair
    #define pb push_back
    #define pii pair<int,int>
    #define C 0.5772156649
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    
    using namespace std;
    using namespace __gnu_cxx;
    
    const double g=10.0,eps=1e-7;
    const int N=5000+10,maxn=100000+10,inf=0x3f3f3f;
    
    vector<int>v[N];
    int dfn[N],low[N];
    int index,num;
    map<int,int>ma[N];
    void tarjan(int u,int f)
    {
        low[u]=dfn[u]=++index;
        for(int i=0;i<v[u].size();i++)
        {
            int x=v[u][i];
            if(x==f)continue;
            if(!dfn[x])
            {
                tarjan(x,u);
                low[u]=min(low[u],low[x]);
                if(low[x]>dfn[u])ma[x][u]=ma[u][x]=1;
            }
            else low[u]=min(low[u],dfn[x]);
        }
    }
    void dfs(int u,int f)
    {
        dfn[u]=num;
        for(int i=0;i<v[u].size();i++)
        {
            int x=v[u][i];
            if(x!=u&&!dfn[x]&&!ma[x][u])dfs(x,u);
        }
    }
    void init(int n)
    {
        memset(dfn,0,sizeof dfn);
        memset(low,0,sizeof low);
        index=num=0;
        for(int i=1;i<=n;i++)
        {
            v[i].clear();
            ma[i].clear();
        }
    }
    int main()
    {
        int n,m;
        while(~scanf("%d%d",&n,&m))
        {
            init(n);
            for(int i=0; i<m; i++)
            {
                int a,b;
                scanf("%d%d",&a,&b);
                if(!ma[a][b])
                {
               //     cout<<a<<" "<<b<<endl;
                    v[a].pb(b);
                    v[b].pb(a);
                    ma[a][b]=ma[b][a]=1;
                }
            }
            for(int i=1;i<=n;i++)ma[i].clear();
            for(int i=1; i<=n; i++)
                if(!dfn[i])
                    tarjan(i,-1);
            memset(dfn,0,sizeof dfn);
            for(int i=1; i<=n; i++)
                if(!dfn[i])
                {
                    ++num;
                    dfs(i,-1);
                }
          //  cout<<num<<endl;
            memset(low,0,sizeof low);
            for(int i=1; i<=n; i++)
            {
                for(int j=0; j<v[i].size(); j++)
                {
                    if(dfn[i]!=dfn[v[i][j]])
                    {
                        low[dfn[i]]++;
                        low[dfn[v[i][j]]]++;
                    }
                }
            }
            int ans=0;
            for(int i=1; i<=num; i++)
            {
                // cout<<low[i]<<endl;
                if(low[i]==2)
                    ans++;
            }
            printf("%d
    ",(ans+1)/2);
        }
        return 0;
    }
    /************
    
    ************/
    View Code
  • 相关阅读:
    STL源代码剖析(二)
    局域网部署docker--从无到有创建自己的docker私有仓库
    Leetcode Add two numbers
    GDIPlus绘制桌面歌词
    Android中apk动态载入技术研究(2)android插件化及实现
    jq 地区(省市县区)联动菜单
    System.Diagnostics.Process.Start的妙用
    aaaa
    RESTful Web 服务:教程
    芒果TV 视频真实的地址获取
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7745332.html
Copyright © 2020-2023  润新知