• P3225 [HNOI2012]矿场搭建


    思路:$tarjan+组合$

    提交:1次

    题解:

    先$tarjan$求出割点,然后按连通块的性质分类讨论:

    1.若没有与割点相连,则需要两个井,防止一个坏掉。

    2.若有一个割点相连,修一个井,考虑井坏了从割点跑到相邻的连通块,或者割点坏了从井逃跑。

    3.若有两个割点相连,则不用修井,直接跑到相邻连通块。

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #define R register int
    const int M=510;
    using namespace std;
    inline int g() {
        R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
        do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
    }
    int n,m,num,cnt,deg,ans,T,rt,tot,C;
    long long anss;
    int vr[M<<1],nxt[M<<1],fir[M],dfn[M],low[M],c[M];
    bool cut[M];
    inline void add(int u,int v) {vr[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;}
    inline void clear() {
        memset(fir,0,sizeof(fir)),memset(c,0,sizeof(c));
        memset(cut,0,sizeof(cut)),memset(dfn,0,sizeof(dfn));
        num=cnt=tot=n=ans=T=0; anss=1;
    }
    inline void tarjan(int u) { dfn[u]=low[u]=++num; R deg=0;
        for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];
            if(!dfn[v]) {
                tarjan(v); low[u]=min(low[u],low[v]);
                if(dfn[u]<=low[v]&&(++deg>1||rt!=u)) cut[u]=true;
            } else low[u]=min(low[u],dfn[v]);
        }
    }
    inline void dfs(int u) {
        c[u]=C; ++cnt;
        for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];
            if(cut[v]&&c[v]!=C) ++tot,c[v]=C;
            if(!c[v]) dfs(v);
        }
    }
    signed main() { R t=0;
        while(m=g(),m!=0) { clear();
            for(R i=1,u,v;i<=m;++i) u=g(),v=g(),add(u,v),add(v,u),n=max(n,max(u,v));
            for(R i=1;i<=n;++i) if(!dfn[i]) rt=i,tarjan(i);
            for(R i=1;i<=n;++i) if(!c[i]&&!cut[i]) {
                ++C; cnt=tot=0;
                dfs(i); if(!tot) ans+=2,anss*=cnt*(cnt-1)/2;
                if(tot==1) ++ans,anss*=cnt;
            } printf("Case %d: %d %lld
    ",++t,ans,anss);
        }
    }

    2019.07.22

  • 相关阅读:
    Oracle自增ID实现
    mysql5修改用户密码及远程访问
    关于线程中修改UI的控件属性
    Javascript 保持浮动位置
    Linq To Entity 查询条件扩展
    反转字符顺序
    VB6.0 二分法解方程
    支持库:FileHelper
    C# 计算加减乘除
    Linq.GroupBy使用示例
  • 原文地址:https://www.cnblogs.com/Jackpei/p/11225128.html
Copyright © 2020-2023  润新知