E - Redundant Paths - 无向图缩点-建边双联通图

  • E - Redundant Paths

  •  POJ - 3177 
  • 题意:加几条边使得图是一个边双连通图,缩点,然后找到度数唯一的点,即叶子节点(叶子节点+1)/2
  • #include
    #include
    #include
    using namespace std;
    #define maxn 5555
    int mmp[maxn][maxn],ind;
    int dfn[maxn],n,u;
    int low[maxn],m,v;
    int cnt[maxn],sum;
    void tarjan(int u,int pre)
    {
        dfn[u]=low[u]=++ind;
        for(int i=1; i<=n; i++)
            if(mmp[u][i])
            {
                if(!dfn[i])
                {
                    tarjan(i,u);
                    low[u]=min(low[i],low[u]);
                }
                else if(i!=pre)
                    low[u]=min(low[u],dfn[i]);
            }
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        while(m--)
        {
            scanf("%d%d",&u,&v);
            mmp[u][v]=mmp[v][u]=1;
        }
        tarjan(1,1);
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                if(mmp[i][j]&&low[i]!=low[j])
                    cnt[low[j]]++;
        for(int i=1; i<=n; i++)
            if(cnt[i]==1)
                sum++;
        printf("%d\n",(sum+1)/2);
        return 0;
    }
    

     

你可能感兴趣的:(图论)