zoukankan      html  css  js  c++  java
  • Blockade

    https://loj.ac/problem/10104

    题目描述

      给出一张n个点、m条边的无向连通图,输出n个数,分别代表删去第i个点后有多少点对不能互通。

    思路

      实质上,如果一个点不是割点,那么删除这个点无法使任何点对无法在连通,所以直接输出n-1。如果这个点是割点,那么显然会把原图分为几个连通块,我们只要求出这几个连通块中的节点数就可以统计答案了。我们记每个点的答案为ans[i],那么当我们进行tarjan(u)时,如果判断了这个点是割点,假设sum为之前其它的点双联通分量的节点数,当又出现一个点双联通分量时,设它的节点数为cnt,那么显然答案就需要增加sum*cnt,再把cnt累加到sum中。而如果结束对所有u连接的点进行访问后,n-sum-1的点也形成一个点双联通分量(即在u上方的节点),累加答案。最后我们再加上删除这个点会使这个点和其他n-1个点不再连通的数量。而题目中说明点对有顺序,所以要乘2。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll N=1e5+10,M=1e6+10;
    
    ll read()
    {
        ll res=0,w=1;
        char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
        while(isdigit(ch))res=(res<<3)+(res<<1)+(ch^48),ch=getchar();
        return res*w;
    }
    
    ll head[N],tot,to[M],nxt[M];
    void add_edge(ll x,ll y)
    {
        nxt[++tot]=head[x];
        head[x]=tot;
        to[tot]=y;
    }
    ll dfn[N],low[N],idx,root;
    ll ans[N],siz[N],n;
    void tarjan(ll u)
    {
        dfn[u]=low[u]=++idx;
        siz[u]=1;
        ll sum=0,cnt=0;
        for(ll i=head[u];i;i=nxt[i])
        {
            ll v=to[i];
            if(!dfn[v])
            {
                cnt++;
                tarjan(v);
                siz[u]+=siz[v];
                low[u]=min(low[u],low[v]);
                if((u==root&&cnt>1)||(u!=root&&low[v]>=dfn[u]))
                {
                    ans[u]+=sum*siz[v];
                    sum+=siz[v];
                }
            }
            else low[u]=min(low[u],dfn[v]);
        }
        ans[u]+=sum*(n-sum-1);
        ans[u]=(ans[u]+n-1)<<1;
    }
    
    int main()
    {
        n=read();
        ll m=read();
        for(ll i=1;i<=m;i++)
        {
            ll x=read(),y=read();
            add_edge(x,y);add_edge(y,x);
        }
        root=1;
        tarjan(1);
        for(ll i=1;i<=n;i++)
            printf("%lld
    ",ans[i]);
    }
  • 相关阅读:
    Logstash配置文件介绍
    ElasticSearch搜索介绍四
    ElasticSearch文档操作介绍三
    ElasticSearch集群介绍二
    ElasticSearch入门介绍一
    Curl中的参数知多少
    sed命令使用介绍(转载)
    实例方法、类方法、静态方法
    函数概述,参数,可变参数,关键字参数,组合参数,递归函数
    startswith()函数与endswith()函数判断文件的开头和结尾
  • 原文地址:https://www.cnblogs.com/fangbozhen/p/11747317.html
Copyright © 2011-2022 走看看