• poj3352 边-双联通分量


    题意:给一个无向图,问最少加几条边变成边-双联通

    题解:求一次双联通,缩点,这样就变成了一棵树,结果就是(树上的叶子节点+1)/2,叶子节点可以通过入度判断

    #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=1000+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);
        }
    }
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=0;i<m;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            v[a].pb(b);
            v[b].pb(a);
        }
        index=num=0;
        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);
            }
        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
  • 相关阅读:
    缺少动态连接库.so--cannot open shared object file: No such file or directory
    BST删除节点
    python中列表字典和字符串的相互转化
    浅谈WM算法
    MySql--主从复制
    python中的__getattr__(self, name)浅谈
    Linux下python路径查找不到的解决办法
    Python闭包和装饰器
    Python操作Mysql数据库
    MySQL----联结
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7745242.html
Copyright © 2020-2023  润新知