zoukankan      html  css  js  c++  java
  • [POI2008]BLO-Blockade [tarjan 割点]

    分为两种情况 一种不为割点时贡献为2*(n-1) 为割点时贡献为各个连通块之间互相的贡献
    开始无法理解 ans[u]+=(ll)sum*sz[v],sum+=sz[v] 是如何求出贡献的
    可以发现在访问该割点下面的各个块时像这样相乘 就把各个块之间相乘的值都计算进去了(==好吧还是自己仔细理解 描述不出来)
    然后就是为无向要*2
     
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    #define Max(x,y) ((x)>(y)?(x):(y))
    #define Min(x,y) ((x)<(y)?(x):(y))
    #define ll long long
    const int N=1e5+5,M=5e5+5,INF=1e9+7,inf=0x3f3f3f3f;
    int n,m;
    ll ans[N];
    template <class t>void rd(t &x){
        x=0;int w=0;char ch=0;
        while(!isdigit(ch)) w|=ch=='-',ch=getchar();
        while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
        x=w?-x:x;
    }
    
    int head[N],tot=0;
    struct edge{int v,nxt;}e[M<<1];
    void add(int u,int v){
        e[++tot]=(edge){v,head[u]},head[u]=tot;
    }
    
    int idx=0,dfn[N],low[N],sz[N];
    void tarjan(int u,int fa){
        dfn[u]=low[u]=++idx,sz[u]=1;
        int sum=0;
        for(int i=head[u],v;i;i=e[i].nxt){
            v=e[i].v;
            if(!dfn[v]){
                tarjan(v,u),low[u]=Min(low[u],low[v]),sz[u]+=sz[v];
                if(dfn[u]<=low[v]&&u!=fa) ans[u]+=(ll)sum*sz[v],sum+=sz[v];
            }
            else if(low[u]>dfn[v]&&v!=fa) low[u]=dfn[v];
        }
        ans[u]+=(ll)sum*(n-sum-1);
    }
    int main(){
        freopen("in2.txt","r",stdin);
        rd(n),rd(m);
        for(int i=1,u,v;i<=m;++i) rd(u),rd(v),add(u,v),add(v,u);
        tarjan(1,0);
        for(int i=1;i<=n;++i) printf("%lld
    ",(ans[i]+n-1)<<1);
        return 0;
    }
  • 相关阅读:
    jython 访问数据库的方法
    Server 2008安装FTP的简单教程
    如何实现Android重启应用程序代码 ?
    android 应用程序自适应屏幕大小
    Android Dialog用法
    2008Server错误
    7种形式的Android Dialog使用举例
    ADB使用方法
    调用手机震动
    android小记之FTP文件上传
  • 原文地址:https://www.cnblogs.com/lxyyyy/p/11341349.html
Copyright © 2011-2022 走看看