题意:n个学校有向图,得到软件的学校可以根据路径发放给其他学校。问1:至少给几个学校发放。问2:给任意一个学校发放,至少添几条边可发放至所有学校。
显然要用Tarjan先找到所有的强连通分量,然后缩点建树。建树之后对每个缩点记其入度出度。显然,对于问题1,只要向入度为0的点发放软件就可满足条件。
那么问题2呢?试想对于所有的子树,每棵子树有根节点和叶节点,要得到强连通分量,显然需要将这些根节点和叶节点连起来。至少连多少呢?答案是max(根节点个数,叶节点个数)。将一棵树的叶节点连到另一棵树的根节点,就可以完成两棵树的连通,消灭掉叶节点和根节点。消灭掉所有的,就得到了一个强连通分量。至少要多少个,就要看根节点和叶节点哪个多了。
代码:
// Header.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include