首页 > 代码库 > Usaco5.3.3 Network of Schools

Usaco5.3.3 Network of Schools

题目描述

一些学校连入一个电脑网络。那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”)。注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中。

你要写一个程序计算,根据协议,为了让网络中所有的学校都用上新软件,必须接受新软件副本的最少学校数目(子任务 A)。更进一步,我们想要确定通过给任意一个学校发送新软件,这个软件就会分发到网络中的所有学校。为了完成这个任务,我们可能必须扩展接收学校列表,使其加入新成员。计算最少需要增加几个扩展,使得不论我们给哪个学校发送新软件,它都会到达其余所有的学校(子任务 B)。一个扩展就是在一个学校的接收学校列表中引入一个新成员。

怎么办呢?我们把这个问题等价一下,相当于求最少从哪几个节点出发,可以遍历整幅图。

我们先来考虑入度:入度为零的节点必须遍历,所以入度为零的节点都被包括在搜索点的集合中。

但是仅仅搜入度为零的节点还不够,因为有可能在图的最边缘的节点组成了一个环,所以我们也应该在最边缘的环中任意选一个节点作为出发点。

可是如果有多个环重叠在一起呢?所以只找环是错误的。

因为有环使问题变得很复杂,我们来考虑无环的请况:结果就是图中入度为零的节点个数。那我们是不是可以把一个有环图缩成一个无环图呢?在遍历问题中这是等价的。

多个环套在一起的请况怎么办?这让我们想到了强连通分量。在经过强联通分量处理后,所有环都变成了等价的点,这样就可以解决子问题A。

同样的,对于子问题B,一个DAG(有向无环图)只要连接后使得入度出度都不等于零,它就一定是强联通分量。

Usaco5.3.3 Network of Schools