Viaky
Hope,is there.

话说这题的解题方式和代码还是不太理解,数据太弱以至于枚举k个点分别进行prim最小生成树,最后取最优值也能过。

简单说说最小限制生成树的理解。

首先明白几个定义:

最小生成树:在一个带权图中用最小的权值和将所有的点连接起来。

最小限制生成树:在图中指定某个点为定点,要求所生成的最小生成树中这个定点的度不能超过k

解法:

首先不考虑k,我们只考虑小于k的某个值p,假设现在生成的树中定点的度为p,如果想要生成p+1的树,我们需要在定点上加一个边连向图中的点,这个边一定不是已经生成的树中的(显然,不然肯定不能达到度+1的目的)。考虑到我们现在是要在生成树中加一条边,由于生成树的定义,这棵树上的所有边已经使每个点都互相连通,那么再加一条边肯定使图中存在了一个环。继续考虑维护最小生成树的定义,我们需要在环中去掉一个边。首先这条去掉的边不能是你后来加进去的(废话么。加上再去掉?),其次我们需要去掉环中权值最大的那条边,因为,最“小”生成树……

现在的问题是我们要找到环中权值最大的边。当然数据比较小的话你可以一一枚举来找,这里我们用到了动态规划的思想。用father[i]记录i点在图中的父节点。最小生成树本质是一棵无根树,所以我们定义原来的定点为根,那么定点的father肯定是无意义的。我们用best[v]表示由定点连向v点的所有边中最大的权值,假设现在要加入点v0,如果v0v的这条边的权值大于best[v],那么就使best[v]:=v-v0;否则使best[v0]:=best[v];

找到了环中的最大边,我们用点到定点的边来替换这条边,以达到度数+1的目的。这样不断地去替换边,知道定点的度数达到了k就输出。

现在我们回到最一开始的问题,即p的取值问题。我们将定点从这张图中删去,那么这张图变成了若干个连通块,对于这每个连通块分别求最小生成树,然后在每个连通块中找最小的边与定点相连,这样我们就构成了度为p的树。需要注意的是如果p>k的话就是无解的。

由此按照上面的思路不断更新即可。

 

Viaky原创。写的不好但也请转载注明出处。

posted on 2011-08-10 21:06  Viaky  阅读(523)  评论(0编辑  收藏  举报