P3225 [HNOI2012]矿场搭建

题目描述
煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处。于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后,其他挖煤点的工人都有一条道路通向救援出口。
请写一个程序,用来计算至少需要设置几个救援出口,以及不同最少救援出口的设置方案总数。
输入输出格式
输入格式:
输入文件有若干组数据,每组数据的第一行是一个正整数 N(N<=500),表示工地的隧道数,接下来的 N 行每行是用空格隔开的两个整数 S 和 T,表示挖 S 与挖煤点 T 由隧道直接连接。输入数据以 0 结尾。
输出格式:
输入文件中有多少组数据,输出文件 output.txt 中就有多少行。每行对应一组输入数据的 结果。其中第 i 行以 Case i: 开始(注意大小写,Case 与 i 之间有空格,i 与:之间无空格,: 之后有空格),其后是用空格隔开的两个正整数,第一个正整数表示对于第 i 组输入数据至少需 要设置几个救援出口,第二个正整数表示对于第 i 组输入数据不同最少救援出口的设置方案总 数。输入数据保证答案小于 2^64。输出格式参照以下输入输出样例。

首先这个题首先我们讨论两种情况,第一种情况就是这个图本来就是一个点连通图,也就是说不存在割点。那么我们任意去掉一个点以后,这个图仍然是联通的。那么我们的逃生出口一定要有两个,保证如果一个逃生出口Over了,还有另外一个逃生出口可以保命。所以总方案数就是Cn2 。
然后第二种情况,这个图存在割点。那么如果坍塌的是这个割点,这个图就会变得不连通。对于那种只和一个割点相连的块,我们至少要在这个块里面选出来一个建逃生通道,而且也是任意选择。假设这个块有p个节点,那么该块的方案数就是Cp-11。(有一个割点所以-1)(p为该块的点数)
针对第二种情况总结来看对于每一个双联通分量我们一共有三种情况:
1.如果这个双联通分量里面没有割点。那么在这个双联通分量里面需要建Cp2个出口。
2.如果双联通分量只有一个割点,那么再非割点的地方任意选择一个点来建逃生出口都没有问题。方案数为Cp-11。
3.若该双联通分量里面有两个割点,那么我们就不需要建立了,因为无论哪一个节点hehe了,其他的点都可以通过其他的没有hehe的点跑到别的双联通分量里面去。
然后以上是针对一个双联通分量的,那么至于总共的方案,我们就可以利用一下组合数学了.....(qwq)。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define INF 0x7fffffff
#define MAXN 100010
#define ll long long
using namespace std;
int n,m;
struct point{
    int from;
    int to;
    int next;
}edge[MAXN*2];
int total,head[MAXN];
void add(int f,int t){
    total++;
    edge[total].from=f;
    edge[total].to=t;
    edge[total].next=head[f];
    head[f]=total;
}
int Yeasion[MAXN],Nein[MAXN];
int stack[MAXN],top,ken;
vector<int>block[MAXN];
int cut[MAXN],cnt,root;
void Tarjan(int now,int fa){
    Yeasion[now]=Nein[now]=++ken;
    stack[++top]=now; int child=0;
    for(int i=head[now];i;i=edge[i].next){
        if(!Yeasion[edge[i].to]){
            Tarjan(edge[i].to,now); child++;
            Nein[now]=min(Nein[now],Nein[edge[i].to]);
            if(now==root&&child>1) cut[now]=1;
            if(now!=root&&Yeasion[now]<=Nein[edge[i].to]) cut[now]=1;
            if(Yeasion[now]<=Nein[edge[i].to]){
                cnt++; block[cnt].clear();
                int pass;
                do{
                    pass=stack[top--];
                    block[cnt].push_back(pass);
                }while(pass!=edge[i].to);/////
                block[cnt].push_back(now);
            }
        }
        else Nein[now]=min(Nein[now],Yeasion[edge[i].to]);
    }
}
void Solve(){
    n=0;
    for(int i=1;i<=m*2;i++){
        Yeasion[i]=Nein[i]=0;
        head[i]=0;
        cut[i]=0;
    }top=ken=cnt=0;
    for(int i=1;i<=m;i++){
        int x; int y;
        scanf("%d%d",&x,&y);
        n=max(n,max(x,y));
        add(x,y); add(y,x);
    };
    for(int i=1;i<=n;i++){
        if(!Yeasion[i]){
            root=i;
            Tarjan(i,-1);
        }
    }
    ll res=0,num=1;
    for(int i=1;i<=cnt;i++){
        int yor=0;
        int len=block[i].size();
        for(int j=0;j<len;j++)
            if(cut[block[i][j]]) yor++;
        if(yor==0) res+=2,num=num*(len-1)*len/2;
        else if(yor==1) res++,num=num*(len-1);
    }
    printf("%lld %lld\n",res,num);
}
int main(){
    int t=1;
    while(scanf("%d",&m)&&m){
        printf("Case %d: ",t++);
        Solve();
    } return 0;
}

[luoguP3325][HNOI2012]矿场搭建的更多相关文章

  1. bzoj2730 [HNOI2012]矿场搭建 (UVAlive5135 Mining Your Own Business)

    2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1147  Solved: 528[Submit][Statu ...

  2. BZOJ 2730: [HNOI2012]矿场搭建( tarjan )

    先tarjan求出割点.. 割点把图分成了几个双连通分量..只需dfs找出即可. 然后一个bcc有>2个割点, 那么这个bcc就不用建了, 因为一定可以走到其他救援出口. 只有一个割点的bcc就 ...

  3. 洛谷 P3225 [HNOI2012]矿场搭建 解题报告

    P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...

  4. 【BZOJ】2730: [HNOI2012]矿场搭建【Tarjan找割点】【分联通块割点个数】

    2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3230  Solved: 1540[Submit][Stat ...

  5. Tarjan 点双+割点+DFS【洛谷P3225】 [HNOI2012]矿场搭建

    P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...

  6. [BZOJ2730][HNOI2012]矿场搭建 点双 割点

    2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2852  Solved: 1344[Submit][Stat ...

  7. 【BZOJ2730】[HNOI2012]矿场搭建 Tarjan

    [BZOJ2730][HNOI2012]矿场搭建 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处. ...

  8. BZOJ 2730:[HNOI2012]矿场搭建(割点+连通块)

    [HNOI2012]矿场搭建 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖 ...

  9. BZOJ_2730_ [HNOI2012]矿场搭建_点双联通分量

    BZOJ_2730_ [HNOI2012]矿场搭建_点双联通分量 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路 ...

随机推荐

  1. Mysql中各种与字符编码集(character_set)有关的变量含义

    mysql涉及到各种字符集,在此做一个总结. 字符集的设置是通过环境变量来设置的,环境变量和linux中的环境变量是一个意思.mysql的环境变量分为两种:session和global.session ...

  2. linux下memcached的启动/结束的方式

    当前项目中,linux下memcached的启动/结束的方式 默认情况下memcached安装到/usr/local/bin下. 进入安装目录,启动memcached:/usr/local/memca ...

  3. [转] .net core Session , Working with a distributed cache

    本文转自:https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed By Steve Smith+ Di ...

  4. iis6、iis7、apache设置mime类型

    1.IIS6添加方法. 打开iis,展开网站,右键要设置的站点--属性.找到“http头”选项卡--mime类型 进行设置添加. 截图以.ipa mime类型举例. 2.IIS7(iis7.5.iis ...

  5. MyBatis 中 sqlmapconfig核心标签typeAliases配置说明

    标签说明 在 MyBatis 的 sql 映射配置文件中,需要使用 paramterType.resultType 来设置 sql 语句的输入输出参数,一般参数都是基本的数据类型或封装类型,但都需要声 ...

  6. 堆(Heap)的实现

    这次实现了堆,这个堆不是指系统堆栈的堆,是一种数据结构,见下图 堆的本质就是一个数组(上图中,红色的是值,黑色的是下标)简单的来说就是把一个数组看成是二叉树,就像上图 大堆和小堆分别是指根节点比孩子节 ...

  7. Csharp:操作存儲過程輸出參數,和返回值

    /// <summary> ///塗聚文 存儲過程輸出參數,和返回值 /// 20131030 /// Geovin Du /// </summary> /// <par ...

  8. Scrum之初体验

    一.前言 入职两个月,作为新人,没有参加过一次早晨的scrum会议. 最大的感触就是,有一天中午,带我的开发哥哥突然说产品今天下午提测,我突然就懵了. 这算是我体会的最大的团队中人没有参加scrum, ...

  9. CSS3中的变形与动画(一)

    CSS3变形篇 旋转rotate() 旋转rotate()函数通过指定的角度参数使元素相对原点进行旋转.它主要在二维空间内进行操作,设置一个角度值,用来指定旋转的幅度.如果这个值为正值,元素相对原点中 ...

  10. asyncio标准库6 Threads & Subprocess

    Threads import asyncio def compute_pi(digits): # implementation return 3.14 async def main(loop): di ...