Description:
给出一个n个节点的有向图,问题一:在其中至少选择多少个节点才能使得从这些节点可以到达所有节点。 问题二:在其中至少要加多少条边能才能使得其中的任一节点可以到达其他所有的节点。
Input:
n 及n个节点的出边
Output:
两个问题的答案
(bonus: 若要输出方案怎么做呢)
Analysis:
和上一题一样首先要将强连通分量缩点形成DAG,然后就要用到DAG上的一些性质。
这里首先假设所得到的DAG中,入度为0的点有a个,出度为0的点有b个。
问题一:答案为a
性质一:DAG中所有入度不为0的点,一定可以从某个入度为0的点出发可达
证明:从任何入度非0的点逆着边不断往回走必然停止于某个入度为0的点,否则形成环与DAG矛盾。
由性质一可知选择所有的入度为0的点就足以使得这些点能够到达图中所有点,而显然至少要选择所有的入度为0的点,才有可能使得这些点可达全部点。所以问题一的答案就是DAG图中入度为0的点数,也就是a。
问题二:答案为max(a,b)
首选我们知道问题二的答案下限就是max(a,b),因为至少要给每一个出度为0或者是入度为0的点至少连一条边才有可能满足条件,而如果这两类点,两两相连也要min(a,b)个边,还剩下max(a,b)-min(a,b)个点需要和其他点相连,这样两部分合起来就是max(a,b)
接下来要证明连max(a,b)个边就足以满足条件。这里用到性质二。
性质二:和性质一类似,从DAG上任何一个点出发不