题目
总时间限制: 1000ms 内存限制: 65536kB
描述
Consider the two networks shown below. Assuming that data moves around these networks only between directly connected nodes on a peer-to-peer basis, a failure of a single node, 3, in the network on the left would prevent some of the still available nodes from communicating with each other. Nodes 1 and 2 could still communicate with each other as could nodes 4 and 5, but communication between any other pairs of nodes would no longer be possible.
Node 3 is therefore a Single Point of Failure (SPF) for this network. Strictly, an SPF will be defined as any node that, if unavailable, would prevent at least one pair of available nodes from being able to communicate on what was previously a fully connected network. Note that the network on the right has no such node; there is no SPF in the network. At least two machines must fail before there are any pairs of available nodes which cannot communicate.
输入
The input will contain the description of several networks. A network description will consist of pairs of integers, one pair per line, that identify connected nodes. Ordering of the pairs is irrelevant; 1 2 and 2 1 specify the same connection. All node numbers will range from 1 to 1000. A line containing a single zero ends the list of connected nodes. An empty network description flags the end of the input. Blank lines in the input file should be ignored.
输出
For each network in the input, you will output its number in the file, followed by a list of any SPF nodes that exist.
The first network in the file should be identified as “Network #1”, the second as “Network #2”, etc. For each SPF node, output a line, formatted as shown in the examples below, that identifies the node and the number of fully connected subnets that remain when that node fails. If the network has no SPF nodes, simply output the text “No SPF nodes” instead of a list of SPF nodes.
样例输入
1 2
5 4
3 1
3 2
3 4
3 5
0
1 2
2 3
3 4
4 5
5 1
0
1 2
2 3
3 4
4 6
6 3
2 5
5 1
0
0
样例输出
Network #1
SPF node 3 leaves 2 subnets
Network #2
No SPF nodes
Network #3
SPF node 2 leaves 2 subnets
SPF node 3 leaves 2 subnets
翻译一下
在计算机网络上有若干节点,输入给你若干点对点的连接。
定义“SPF”为这样的节点:如果删除它,它所在的网络将被划分为若干个子网,每个子网内部连通,但子网之间不连通。
对于每个case,让你输出其中所有的SPF,以及这些SPF把它所在网络分割为了几个子网。
分析
很直白了,所谓SPF就是求割点,并求出割点所分割的连通分量数(我们称为割数)。我们使用Tarjan算法。
Tarjan割点算法
Tarjan割点算法使用深度优先搜索方式建立一棵搜索树。需要为每个节点维护变量dfn和low。dfn记录它被搜索到的次序,low则记录包含该节点的任何环路中的最小dfn。初始时,low=dfn。
我们在递归搜索的同时,计算出每个节点的low。
- 根据图的性质:对于连通图的任何生成树,如果一个节点u到另一节点v有【非父子边】,则必定有环路经过u和v。所以当我们找到一个节点u,它存在非父子边达到已经搜索过的节点v时,说明有环,我们更新low[u]为min(low[u], dfn[v])。
- 而当搜索回溯时,我们更新low[u]为min(low[u], low[v])——因为如果low[v]<low[u](我们知道dfn[v] > dfn[u]),必然是因为v之后找到环了,且这个环肯定会经过先于u被搜索到的节点。
怎么求割数呢?
- 如果一个节点v是搜索树的根,则它的割数为搜索树上,根的子树的个数。
- 如果一个节点v不是根,那么它的割数为:1 + (v的子节点中,其low不超过v的dfn的子节点个数),也就是 1 + ∣ ∣ { u ∣ u 是 v 的 子 节 点 , 且 过 v 的 环 都 在 u 为 根 的 子 树 中 } ∣ ∣ 1 + ||\{u| u是v的子节点,且过v的环都在u为根的子树中\}||