题目描述 Description

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

输入描述 Input Description

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

输出描述 Output Description

输入文件中有多少组数据,输出文件中就有多少行。每行对应一组输入数据的结果。其中第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

数据范围及提示 Data Size & Hint

Case 1 的四组解分别是(2,4),(3,4),(4,5),(4,6);
Case 2 的一组解为(4,5,6,7)。

/*
隔点会把此图分成若干个连通块。
如果一个连通块与两个及以上的割点相连,就不建;与一个相连,就建一个,没有相连的,就建两个。方案数用乘法原理。
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 510
using namespace std;
int head[N],n,m,cas;
int num[N],low[N],in[N],s[N],ok[N],sum[N],r[N],used[N],vis[N],top,tot,indexx;
struct node
{
int v,pre;
};node e[N*];
void clear()
{
memset(e,,sizeof(e));
memset(head,-,sizeof(head));
memset(num,,sizeof(num));
memset(low,,sizeof(low));
memset(in,,sizeof(in));
memset(s,,sizeof(s));
memset(ok,,sizeof(ok));
memset(sum,,sizeof(sum));
memset(r,,sizeof(r));
memset(used,,sizeof(used));
memset(vis,,sizeof(vis));
top=tot=indexx=n=;
}
void add(int i,int x,int y)
{
e[i].v=y;
e[i].pre=head[x];
head[x]=i;
}
void tarjan(int u,int fa)
{
int x=;
num[u]=low[u]=++indexx;
in[u]=;s[++top]=u;
for(int i=head[u];i!=-;i=e[i].pre)
{
if(fa==(i^))continue;
int v=e[i].v;
if(!num[v])
{
x++;
tarjan(v,i);
low[u]=min(low[u],low[v]);
if(low[v]>=num[u])ok[u]=;
}
else if(in[v])
low[u]=min(low[u],num[v]);
}
if(fa==-&&x<)ok[u]=;
}
void dfs(int x)
{
vis[x]=;sum[tot]++;
for(int i=head[x];i!=-;i=e[i].pre)
{
int y=e[i].v;
if(vis[y])continue;
if(ok[y])
{
if(used[y]!=tot)
{
used[y]=tot;r[tot]++;
}
}
else dfs(y);
}
}
int main()
{
while(scanf("%d",&m))
{
if(!m)break;clear();
for(int i=;i<=m;i++)
{
int x,y;scanf("%d%d",&x,&y);
add(i*-,x,y);add(i*-,y,x);
n=max(n,max(x,y));
}
for(int i=;i<=n;i++)
if(!num[i])tarjan(i,-);
for(int i=;i<=n;i++)
if(!vis[i]&&!ok[i])
{
++tot;dfs(i);
}
int ans1=;long long ans2;
if(tot==)
{
ans1=;
ans2=(long long)(sum[]*(sum[]-)/);
}
else
{
ans2=;
for(int i=;i<=tot;i++)
if(r[i]==)ans1++,ans2*=(long long)sum[i];
}
printf("Case %d: %d ",++cas,ans1);cout<<ans2<<endl;
}
return ;
}

矿场搭建(codevs 1996)的更多相关文章

  1. 【BZOJ-2730】矿场搭建 Tarjan 双连通分量

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

  2. [HNOI2012] 矿场搭建

    /* codevs 1996 连通性问题 Tarjan+割点 可以感性的想一想 一定炸割点最好 否则 没有什么影响 先求出割点来 对于剩下的点们 缩一下 当然不能包括割点 这里的缩 因为删了割点就不是 ...

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

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

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

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

  5. bzoj2730(矿场搭建)

    矿场搭建,不知道为什么,莫名其妙T了在212上,额,zyh数据真的坑. bzoj200轻松跑过啊. 就是点双联通分量缩点,然后标记割点,一个块如果有>=2个割点,则不需要挖矿洞, 如果只有一割点 ...

  6. 【CJOJ P1333】【HNOI2012】矿场搭建

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

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

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

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

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

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

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

  10. 【BZOJ】【2730】【HNOI2012】矿场搭建

    Tarjan求BCC/割点 然而似乎我一开始抄的白书的板子哪里抄错了?还是本身哪里不对……(可能是不适用于这道题?因为这题要求求出每个BCC的大小..? 膜拜了ydc的写法= = 其实两次dfs也并没 ...

随机推荐

  1. javascript 正则表达式使用

    切记:js 正则表达式无需用双引号,正则表达式不是字符串. 参考网址:http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp 个人用于查找字条串匹配 ...

  2. Web服务精讲–搭个 Web 服务器(二)

    导读 曾几何时,你所选择的 Python Web 框架会限制你所可选择的 Web 服务器,反之亦然.如果某个框架及服务器设计用来协同工作的,那么一切正常. 在第一部分中,我提出了一个问题:“如何在你刚 ...

  3. [HDU3555]Bomb

    [HDU3555]Bomb 试题描述 The counter-terrorists found a time bomb in the dust. But this time the terrorist ...

  4. Oracle Redo

    Redo log 重做日志在Oracle数据库中,有一种日志文件叫做重做日志文件,他就是大家俗称的:redolog.在redolog中又分为两种:在线重做日志与归档日志. ONLINE Redo lo ...

  5. PHP四种基础算法详解

    许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要 ...

  6. (转载)XML解析之-XStream解析

    转载来源:http://hwy584624785.iteye.com/blog/1168680 本例使用XStream生成一个xml文件,再发序列化xml文件内容. XStream是一个简单的类库,可 ...

  7. CH Round #55 - Streaming #6 (NOIP模拟赛day2)解题报告

    T1九九归一 描述 萌蛋在练习模n意义下的乘法时发现,总有一些数,在自乘若干次以后,会变成1.例如n=7,那么5×5 mod 7=4,4×5 mod 7=6,6×5 mod 7=2,2×5 mod 7 ...

  8. python成长之路 :线程、进程和协程

    python线程 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分 ...

  9. .Net Framework 3.5, 3.5 sp1 中文版离线安装

    安装.Net Framework 3.5和3.5 sp1时会自动下载语言包. 解决办法:下载语言包,将语言包拷贝到安装里. 1.用压缩工具解压.NetFramework3.5 2.将语言包文件拷贝到c ...

  10. Mybatis 3.3.0 Log4j配置

    最近做一个SSM学习项目,配置log4j,mybatis用下面的方式配置,不管用,打印不出执行的SQL语句. log4j.logger.java.sql.Connection=DEBUGlog4j.l ...