tarjan学习

P2812 校园网络

摘抄优秀性质:

当我们已经完成 TARJAN强连通分量缩点 之后,下一步任务是对DAG图 添加边 减少强连通分量数量使得 仅存一个强连通分量。

我们可以知道以下原理:

原理一 :每添加一条边,就会使该边出发的点增加一个出度,该边到达的点增加一个入度。

原理二 :对于一个包含多个点的强连通分量,它每一个点在缩点之前出度和入度一定都不为0。即对于一张有向图,如果每一个点的出度和入度都不为0,那么这张有向图必定可以进行 强连通分量缩点 或者存在 自环 。

根据原理一、二,我们可以做出以下简单推论:

推论一 :对于任意一张包含多个点的DAG图( 缩点 后的任意有向图。),若要向其中添加一些边使得仅存一个强连通分量,添加边的数目不小于 入度为0的点 和 出度为0的点 的数目的较大值。

如果我们足够聪明,且条件足够合理,则有可能找到一种策略让我们 仅添加最少的边 就让整张图形成一个强连通分量。根据推论一和我们足够聪明的,且条件足够合理的前提,我们做出以下猜想:

猜想一 :对于任意一张包含多个点的DAG图( 缩点 后的任意有向图。),若要向其中添加一些边使得仅存一个强连通分量,添加边的数目的最小值是 入度为0的点 和出 度为0的点 的数目的较大值。

证明

尽管这个猜想看起来很合理,仍需证明。现在给出 小咕儿 的策略来对其进行证明。

我们可以知道以下原理:

原理三 :任何包含多个点的DAG图都是由 可以单向联通的DAG图 (下文称 简单DAG图 )构成的。

原理四 :对于任何包含多个点的 简单DAG图 ,都存在至少一个 入度为0的点 ,可以到达所有 出度为0的点 。称这个点为 总入点 。

原理五 :对于任何包含多个点的 简单DAG图 ,都存在至少一个 出度为0的点 ,所有 入度为0的点 可以到达。称这个点为 总出点 。

原理六 :对于任何包含多个点的 简单DAG图 ,建立有向边<总出点,总入点>, 入度为0的点 数量大于1时总是不会缩点后形成一个 入度为0 的点;出度为0的点 数量大于1时总是不会缩点后形成一个 出度为0 的点。

原理七 :对于任何多个包含多个点的 简单DAG图 都可以采取选择不同分图的一个入度和出度连接形成一个 简单DAG图 。

根据原理三,我们可以知道DAG图问题实际上是由简单DAG图问题组成的。

根据原理四、五、六,我们采取以下策略对简单DAG图进行操作。当出度为0的点或入度为0的点数量大于1时,每次连接一对总入点和总出点,建立有向边<总出点,总入点>。这样的操作最多进行( 入度为0的点 和 出度为0的点 的数量的较小值-1)次。

下一次进行这样的操作后,我们会发现会出现以下三种情况:

情况一 :原图 入度为0的点 和 出度为0的点 的个数相等。此时入度为0的点的数量和出度为0的点数量都为1。这是由缩点产生的,并不是原来的点遗留的。整张图缩点仅剩一个点,必然是强连通图,一共添加了 入度为0的点 或 出度为0的点 的个数条边。

情况二 :原图 入度为0的点 的个数大于 出度为0的点 的个数。此时出度为0的点数量为1。这是由缩点产生的,并不是原来的点遗留的。继续进行这样的操作,直到 入度为0的点 的个数为0为止,整张图缩点仅剩一个点,必然是强连通图,一共添加了 入度为0的点 的个数条边。

情况三 :原图 出度为0的点 的个数大于 入度为0的点 的个数。此时入度为0的点数量为1。这是由缩点产生的,并不是原来的点遗留的。继续进行这样的操作,直到 出度为0的点 的个数为0为止,整张图缩点仅剩一个点,必然是强连通图,一共添加了 出度为0的点 的个数条边。

因此我们可以得出以下推论:

推论三 :对于任意一张包含多个点的简单DAG图,若要向其中添加一些边使得仅存一个强连通分量,添加边的数目的最小值是 入度为0的点 和出 度为0的点 的数目的较大值。

然后再根据原理七,我们可以知道通过原理七所述的方式,会减少( 简单DAG图 分图的数量-1)个出度为0的点和入度为0的点,同时使用( 简单DAG图 分图的数量-1)条边。根据简单的数学知识(max(a,b)=max(a+c,b+c)-c),我们可以得出结论:

结论一 :

猜想一成立。

对于任意一张DAG图( 缩点 后的任意有向图。),若要向其中添加一些边使得仅存一个强连通分量,添加边的数目的最小值是 入度为0的点 和 出度为0的点 的数目的较大值。

所以这道题prob2的答案就是: 包含多个点时 :整个DAG图中 入度为0的点 和 出度为0的点 的数目的较大值。 包含一个点时:无需添加任何边,即0。

posted @ 2019-12-03 20:19  生命是华丽错觉  阅读(69)  评论(0)    收藏  举报