题目描述
煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处。于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后,其他挖煤点的工人都有一条道路通向救援出口。
请写一个程序,用来计算至少需要设置几个救援出口,以及不同最少救援出口的设置方案总数。
输入格式
输入文件有若干组数据,每组数据的第一行是一个正整数 N(N<=500),表示工地的隧道数,接下来的 N 行每行是用空格隔开的两个整数 S 和 T,表示挖 S 与挖煤点 T 由隧道直接连接。输入数据以 0 结尾。
输出格式
输入文件中有多少组数据,输出文件 output.txt 中就有多少行。每行对应一组输入数据的 结果。其中第 i 行以 Case i: 开始(注意大小写,Case 与 i 之间有空格,i 与:之间无空格,: 之后有空格),其后是用空格隔开的两个正整数,第一个正整数表示对于第 i 组输入数据至少需 要设置几个救援出口,第二个正整数表示对于第 i 组输入数据不同最少救援出口的设置方案总 数。输入数据保证答案小于 2^64。输出格式参照以下输入输出样例。
输入输出样例
输入 #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
说明/提示
Case 1 的四组解分别是(2,4),(3,4),(4,5),(4,6);
Case 2 的一组解为(4,5,6,7)。
一道题做了我6个小时。。。,完全不懂Tarjan,完全不知道啥是双连通分量啊,最要命的是一直不理解根据割点个数讨论的那个地方。。。查过来查过去,总算是搞清楚了。本来应该详细讲讲Tarjan的,但我实在是做吐了。。。就题讲题吧。
这是一道Tarjan求无向图中双连通分量的题。
1. 使用Tarjan找到割点,划分双连通分量。
2. 使用DFS搜索每个双连通分量,找到他们所连接的割点的数量。
3. 根据割点进行讨论。
大致思路:
1. 使用Tarjan算法找到所有的割点。因为Tarjan是基于深度优先搜索(DFS)的思想,所以Tarjan搜索完整个图之后,可以得到一棵树。下图中,图一是原图,图二是按照Tarjan搜素形成的一棵树。在这里,我们假设Tarjan递归的入口节点为黄色节点。