Description

煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处。于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后,其他挖煤点的工人都有一条道路通向救援出口。请写一个程序,用来计算至少需要设置几个救援出口,以及不同最少救援出口的设置方案总数。

Input

输入文件有若干组数据,每组数据的第一行是一个正整数 N(N≤500),表示工地的隧道数,接下来的 N 行每行是用空格隔开的两个整数 S 和 T,表示挖       S 与挖煤点 T 由隧道直接连接。输入数据以 0 结尾。

Output

输入文件中有多少组数据,输出文件 output.txt 中就有多少行。每行对应一组输入数据的 结果。其中第 i 行以 Case i: 开始(注意大小写,Case 与 i 之间有空格,i 与:之间无空格,: 之后有空格),其后是用空格隔开的两个正整数,第一个正整数表示对于第 i 组输入数据至少需 要设置几个救援出口,第二个正整数表示对于第 i 组输入数据不同最少救援出口的设置方案总 数。输入数据保证答案小于 2^64。输出格式参照以下输入输出样例。

Sample Input

9
1 3
4 1
3 5
1 2
2 6
1 5
6 3
1 6
3 2
6
1 2
1 3
2 4
2 5
3 6
3 7
0

Sample Output

Case 1: 2 4
Case 2: 4 1

HINT

Case 1 的四组解分别是(2,4),(3,4),(4,5),(4,6);
Case 2 的一组解为(4,5,6,7)。
———————————————————————————————
这道题我们发现对于每一个点双联通分量 如果他没有割点 那么他就是一个单独的块 
对于这样的块 我们应该给他设两个出口 防止一个崩了 而对于只有一个联通块的 我们应该设一个不再割点的出口
这样如果出口崩掉了还可以去别的块 而对于有大于一个割点 不用设出口 他可以随便去别的块
然后乘法原理就可以辣 (吐槽:点双写起来贼丑
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using std::max;
using std::min;
const int M=1e3+;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int n,m;
int first[M],cnt,buck[M];
struct node{int from,to,next;}e[*M];
void ins(int a,int b){e[++cnt]=(node){a,b,first[a]}; first[a]=cnt;}
void insert(int a,int b){ins(a,b); ins(b,a);}
int dfn[M],low[M],T,iscut[M];
int hc,sz[M],color[M],stk[M],top;
void clear(){
n=; cnt=; T=; hc=; top=;
memset(iscut,,sizeof(iscut));
memset(first,,sizeof(first));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(sz,,sizeof(sz));
memset(color,,sizeof(color));
memset(buck,,sizeof(buck));
}
void tarjan(int x,int fa){
low[x]=dfn[x]=++T;
int child=;
for(int i=first[x];i;i=e[i].next){
int now=e[i].to;
if(!dfn[now]){
stk[++top]=i;
child++;
tarjan(now,x);
low[x]=min(low[x],low[now]);
if(low[now]>=dfn[x]){
iscut[x]=;
hc++;
while(){
int k=stk[top--];
if(color[e[k].from]!=hc){
if(color[e[k].from]) buck[color[e[k].from]]++;
sz[hc]++; color[e[k].from]=hc;
}
if(color[e[k].to]!=hc){
if(color[e[k].to]) buck[color[e[k].to]]++;
sz[hc]++; color[e[k].to]=hc;
}
if(e[k].from==x&&e[k].to==now) break;
}
}
}
else if(dfn[now]<dfn[x]&&now!=fa) stk[++top]=i,low[x]=min(low[x],dfn[now]);
}
if(fa==-&&child==) iscut[x]=;
}
int main(){
int x,y,h=;
while(scanf("%d",&m)==&&m){
++h; clear();
for(int i=;i<=m;i++){
x=read(); y=read();
insert(x,y); n=max(n,max(x,y));
}
for(int i=;i<=n;i++)if(!dfn[i]) tarjan(i,-);
for(int i=;i<=n;i++)if(iscut[i]) buck[color[i]]++;
LL ans=;
int tot=;
for(int i=;i<=hc;i++){
if(buck[i]==) ans*=max(sz[i]-,),tot++;
if(!buck[i]) ans*=sz[i]*(sz[i]-)/,tot+=;
}
printf("Case %d: %d %lld\n",h,tot,ans);
}
return ;
}

bzoj 2730: [HNOI2012]矿场搭建——tarjan求点双的更多相关文章

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

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

  2. 【刷题】BZOJ 2730 [HNOI2012]矿场搭建

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

  3. bzoj 2730: [HNOI2012]矿场搭建【tarjan】

    先tarjan找割点和点双连通分量,然后对一个点双,如果没有割点,那么需要建立两个出口(割掉一个另一个备用):如果只有一个割点,出口可以设立在任意一个非割点的地方:如果有两个及以上个割点,就不用建出口 ...

  4. bzoj 2730: [HNOI2012]矿场搭建

    #include<cstdio> #include<cstring> #include<iostream> #define M 508 using namespac ...

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

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

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

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

  7. BZOJ 2730 矿场搭建 Tarjan求割点

    思路: Tarjan求出来点双&割点 判一判就行了 //By SiriusRen #include <stack> #include <cstdio> #include ...

  8. BZOJ2730 [HNOI2012]矿场搭建 - Tarjan割点

    Solution 输入中没有出现过的矿场点是不用考虑的, 所以不用考虑只有 一个点 的点双联通分量. 要使某个挖矿点倒塌, 相当于割去这个点, 所以我们求一遍割点和点双联通分量. 之后的点双联通分量构 ...

  9. [BZOJ2730][HNOI2012]矿场搭建(求割点)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2730 分析: 如果坍塌的点不是割点,那没什么影响,主要考虑坍塌的点是割点的情况. 显然 ...

随机推荐

  1. Huffuman树

    问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下: 1. ...

  2. SVM之核函数

    SVM之问题形式化 SVM之对偶问题 >>>SVM之核函数 SVM之解决线性不可分 写在SVM之前——凸优化与对偶问题 上一篇SVM之对偶问题中讨论到,SVM最终形式化为以下优化问题 ...

  3. mybatis小结-001

    代码不能直接copy运行,有些内容是为了说明知识点 1,sqlMqpConfig.xml <?xml version="1.0" encoding="UTF-8&q ...

  4. Android基础------高级ul:消息对话框

    前言:Android消息对话框提示笔记,刚刚接触Android 1.经典模式 //列表对话框 //经典模式 public void listdialog_01(View view){ final St ...

  5. asp.net mvc4使用log4.net 日志功能

    对于网站来讲,不能把异常信息显示给用户,异常信息只能记录到日志,出了问题把日志文件发给开发人员,就能知道问题所在. 下面演示网站 出错后自动添加出错日志的实例 (1)新建一个WebApplicatio ...

  6. 在html在添加cookie和读取cookie

    1.保存cookie var oDate = new Date(); oDate.setDate(oDate.getDate() + );//有效期为30天 document.cookie = &qu ...

  7. 文件传输底层是二进制 所以在传输前可以通过 InputStreamer 指定传输出的编码格式

    文件传输底层是二进制 所以在传输前可以通过 InputStreamer 指定传输出的编码格式

  8. Python列表去重的三种方法

    1. 列表去重 li = [] for item in my_list: if item not in li: li.append(item) 2.集合去重 list(set(my_list)) 3. ...

  9. Python_css选择器

    1. 概述 css是英文Cascading Style Sheets的缩写,称为层叠样式表,用于对页面进行美化. 存在方式有三种:元素内联.页面嵌入和外部引入,比较三种方式的优缺点. 语法:style ...

  10. java 注解使用笔记

    一.语法 注解也属于一种类型 public @interface MyTestAnnotation { } 用@interface描述 根据情况可以应用于包.类型.构造方法.方法.成员变量.参数及本地 ...