对于最小树形图的理解

最小树形图的算法步骤简化得说一下就是重复一下三个步骤,直到图中没有环为止或者判定有孤立节点无法形成最小树形图:

1、删除自环,除根节点以外,每个点留最小入边;2、判断有没有环;3、如果有环,缩为一点。

现在就从头开始分析一下这个算法。

分析第一步:

每个点地最小入边,这个没有问题,也是一种贪心的思想;

为什么留的是入边,这也很好解释,有入边这个点才能被到达。

分析第二步:

如果这个图是连通的,每一个点留一条入边,那么此时图中就有n-1条边,如果有环那么必定有点之间没有被连接;

如果有孤立节点,那么一定是这个图不连通

如果没有环同时每个结点(除根以外)都有前驱,那么所求的值就是最小树形图的权值。

前两步都比较好理解,关键在于第三步。

着重分析一下第三步:

       首先,什么是一个环缩为一点呢?

就是把这个环看做整体,即一个新的点,然后做一系列的操作(这些操作保证了结果的正确),形成一个“新”的图,然后再重复这三步;

       接着,这一系列的操作是什么?

所有环上的所有的点(注意这点每次循环都会被更新,是动态的),除了它的最小入边,其他的入边的权值都减去最小入边的权值(后面简称它为减法操作),然后箭头指向“新”的点(也就是这个环)。

其实这个算法和kruskal很像,如果按照kruskal的思想,如果有一条边加入到图中形成环,那么删除这条边,找一条次小的边,直到符合条件。

那么同样的,如果在求最小树形图的过程中出现了这样的情况,我们也一样要删除一条边,在一条边代替;不同的是,有向图的边并不是相等的,即使是起始点相同,还有方向不同也就是说我们不能简单删除这个环上的最大边或最小边。

例如,要删除最大边,而这个点只有最大边这一条入边,那么使得一点不连通;就算这条边不是这个点唯一的入边,那么删除它之后还要找替代边,已知这个上的边都是最小入边,其他入边只能大于它,删除最大边之后再找这个点次小入边,必定大于环上的其他所有边,就会存在这样的情况,某一个较小的边所对应的点有一条比这个替代的边小的入边,如果把这条较小的边的替代边加进来,保留原来环上最大边,删除较小边,显然图的总权值会小于删除最大边的情况,这样说明删除最大边是错的。那么如果删除最小的呢?可是我们无法保证这个最小边的替代边比这个环上其他所有边的代替边都小,显然情况很多!

但是,我们要注意一点

首先我们留下的是最小入边,并且这是一个环,也就是说,这个环上任意一个点的任意一个入边,都可以与环上所有点连通(不理解可以画个图),那么如果我们求出这个环的最小入边,删除相应的边,这样环上所有点依旧连通,并且保证了权值最小。因此,我们要把这个环看做是一个新的点,求这个新的点的最小入边

那么怎么求这个新的点的最小入边呢?

那就是要比较环上所有点的所有次小入边,找出其中最小的,作为这个“新点”的最小入边(但是这样很麻烦,接下来的加法操作会说明并解决这个麻烦的问题)。

再有就是为什么要做减法操作呢?

我认为有两点个主要原因:

1、每次都找环上每个点的小边,很可能环和环之间有组成了一个环,那么一个点可能有上千个入边,最后可能就找第i小的边,显然很麻烦!巧妙地把环上所有的点都标记成相同的序号,设成一个点,然后设法找这个点的最小入边即可;

2、我觉得这个减法操作最巧妙!这个我们可以这样考虑,当形成了一个环的时候,我们要删除一条环上的边,加一条环之外的边,由于每次保留的都是最小入边,那么总权值一定是要增加的,如过能让这个增值最小,那就首先保证了结果的正确,其次保证了每次都是找的最小增值,而增值就是其他入边减去最小入边,即e[i].w -= in[i]; ”。因此,每次要替换边的时候,只要加上最小增值即可。接着,我们想到,干脆就把这个增值付给环的入边,那么这个问题就规约到了求图中除了根节点外的其他节点的最小入边集,也就是这个算法的一步!

又一次,我被算法打动了,是在是太巧妙了!

hdu4009 transfer water就是这样的一道题,它的分析和解答我写在下一篇总结中。

是一个最小树形图的形成过程:

对于最小树形图的理解_第1张图片

你可能感兴趣的:(对于最小树形图的理解)