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. underscore javascript工具库支持seajs模块化

    underscore是一个很有用的js工具库,但是好像默认不支持seajs模块化 新建一个文件例如叫做xx.js 谈后,键入 define(function(require,exports,modul ...

  2. Python快速入门_1

    注释 # 用#号字符开头注释单行 """ 三个引号可以注释多行 三个引号可以注释多行 三个引号可以注释多行 """ 原始数据类型和运算符 ( ...

  3. MongoDB集群怎样去访问?

    上一章节简单介绍了MONGODB的集群搭建.相信大家都已经很熟悉了.集群搭建完接下来应该考虑我们的程序应该怎样去访问他. 怎么读写数据等操作.下面把我在工作中的一些用法列出来供大家作为参考. 官网的链 ...

  4. 调用WCF错误-There was no endpoint listening

    问题描述: 今天在调用WCF服务时候出现了下面的错误. 原因: 调用服务的客户端ip设置成了固定ip.(至于固定ip为什么会导致这个错误,没能去研究) 解决方法: 将客户端ip设置成自动获取.

  5. python爬取英语学习资料并发送邮件

    新建发送邮件类 import smtplib from email.mime.text import MIMEText from email.header import Header class Se ...

  6. C#学习笔记8

    1.泛型的约束: (1)接口约束: (2)基类约束,基类约束必须放在第一(假如有多个约束): (3)struct/class约束: (4)多个参数类型的约束,每个类型参数都要用where关键字: (5 ...

  7. hibernate的各种保存方式的区别 (save,persist,update,saveOrUpdte,merge,flush,lock)

    hibernate的保存hibernate对于对象的保存提供了太多的方法,他们之间有很多不同,这里细说一下,以便区别:一.预备知识:在所有之前,说明一下,对于hibernate,它的对象有三种状态,t ...

  8. VS2012 无法启动 IIS Express Web

    用记事本打开项目的.csproj文件,定位到<WebProjectProperties>,把关于IIS的配置<DevelopmentServerPort>.<Develo ...

  9. ASTreeView Demo:Add, Edit & Delete nodes

    http://www.jinweijie.com/ http://www.astreeview.com/astreeviewdemo/astreeviewdemo1.aspx 選擇節點: <sc ...

  10. springmvc 登陆拦截器 配合shiro框架使用

    public class LoginHandlerInterceptor extends HandlerInterceptorAdapter{ @Override public boolean pre ...