zoukankan      html  css  js  c++  java
  • [APIO2018]铁人两项 [圆方树模板]

    把这个图缩成圆方树,把方点的权值设成-1,圆点的权值设成点双的size,算 经过这个点的路径的数量*这个点的点权 的和即是答案。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int N=1000005;
    struct Edge{
        int to[N],nxt[N],head[N],ecnt;
        Edge(){ecnt=0;}
        void add(int bg,int ed) {nxt[++ecnt]=head[bg];to[ecnt]=ed;head[bg]=ecnt;}
        void ins() {int bg,ed;scanf("%d%d",&bg,&ed);add(bg,ed),add(ed,bg);}
    }e1,e2;
    int n,m,low[N],dfn[N],tim,stk[N],top,siz[N],tot,val[N],sum;
    long long ans;
    bool vis[N];
    void tarjan(int x) {siz[x]=1;
        low[x]=dfn[x]=++tim;vis[x]=1;stk[++top]=x;
        for(int i=e1.head[x];i;i=e1.nxt[i]) {
            int v=e1.to[i];
            if(!dfn[v]) {
                tarjan(v);
                low[x]=min(low[x],low[v]);
                if(low[v]>=dfn[x]) {
                    int u=0,num=1;
                    ++tot;
                    low[x]=min(low[x],low[v]);
                    do {
                        u=stk[top--];num++;
                        e2.add(tot,u),e2.add(u,tot);
                        siz[tot]+=siz[u];
                    }while(u!=v);
                    val[tot]=num;siz[x]+=siz[tot];
                    e2.add(tot,x),e2.add(x,tot);
                }
            }
            else  low[x]=min(low[x],dfn[v]);
        }
    }
    void dfs(int x,int fa) {
        int tmp=x<=n;
        ans+=2ll*siz[x]*(sum-siz[x])*val[x];
        for(int i=e2.head[x];i;i=e2.nxt[i]) {
            int v=e2.to[i];
            if(v!=fa) ans+=2ll*tmp*siz[v]*val[x],
            tmp+=siz[v],
            dfs(v,x);
        }
        
    }
    int main() {
        scanf("%d%d",&n,&m);tot=n;
        memset(val,-1,sizeof val);
        for(int i=1;i<=m;i++) e1.ins();
        for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i),sum=siz[i],dfs(i,0);
        printf("%lld",ans);
    }
    铁人两项
    我是咸鱼。转载博客请征得博主同意Orz
  • 相关阅读:
    php socket 读取缓存区域
    PHP依赖注入的作用
    谷歌浏览器调试文字都变成font标签的解决方法
    php socket 同步异步堵塞非堵塞的区别
    css3中background-size中的cover与contain的区别
    css3 line-height:0的作用
    RDD的创建方式
    Serializable序列化操作解惑
    SparkCore分布式计算模拟
    spark不同环境下计算pi值
  • 原文地址:https://www.cnblogs.com/sdfzhsz/p/9737877.html
Copyright © 2011-2022 走看看