#gDHQybttg030602. 1521:【 例 2】矿场搭建
1521:【 例 2】矿场搭建
1521:【例 2】矿场搭建
题目描述
煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处。于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后,其他挖煤点的工人都有一条道路通向救援出口。
请写一个程序,用来计算至少需要设置几个救援出口,以及不同最少救援出口的设置方案总数。
输入格式
输入有若干组数据,每组数据的第一行是一个正整数 ,表示工地的隧道数,接下来的 行每行是用空格隔开的两个整数 和 ,表示挖煤点 与挖煤点 由隧道直接连接。输入数据以 结尾。
输出格式
输入中有多少组数据,输出中就有多少行。每行对应一组输入数据的结果。
其中第 行以 Case i: 开始(注意大小写,Case 与 i 之间有空格,i 与 : 之间无空格,: 之后有空格),其后是用空格隔开的两个正整数,第一个正整数表示对于第 组输入数据至少需要设置几个救援出口,第二个正整数表示对于第 组输入数据不同最少救援出口的设置方案总数。
输出格式参照以下输入输出样例。
样例
样例输入 #1
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
样例输出 #1
Case 1: 2 4
Case 2: 4 1
样例解释 #1
Case 1:
- 有 条隧道,挖煤点编号至少从 到 。
- 原图可能是连通的,包含割点。需要放置救援出口使得任意一个挖煤点坍塌后,其余点都能到达某个救援出口。
- 最少需要 个救援出口,有 种方案:。
Case 2:
- 有 条隧道,挖煤点编号至少从 到 。
- 最少需要 个救援出口,只有 种方案:。
数据范围
- 输入数据保证答案小于 (即可以用
unsigned long long存储)
时空限制
- 时间限制:1000 ms
- 内存限制:131072 KB
注意:本题是点双连通分量(双连通分量)的应用。首先求出所有割点,然后对原图进行点双连通分量分解(Tarjan 算法)。对于每个点双连通分量:
- 如果该分量中没有割点,则需要设置两个救援出口(防止其中一个出口所在的挖煤点坍塌),方案数为 ,其中 是该分量中的节点数。
- 如果该分量中有一个割点,则需要设置一个救援出口(不能设在割点上,因为割点可能坍塌),方案数为 (除割点外任选一个)。
- 如果该分量中有两个或以上割点,则不需要设置救援出口(因为通过割点可以到达其他分量中的出口)。
注意一个割点可能属于多个点双连通分量。最终答案是所有分量的救援出口数之和,方案数是所有分量方案数的乘积(乘法原理)。注意原图可能不连通,需要对每个连通块分别处理。