现在的位置: 首页 > 综合 > 正文

最小树形图

2013年09月13日 ⁄ 综合 ⁄ 共 921字 ⁄ 字号 评论关闭

 

所谓的最小树形图,就是给有向带权图一个特殊的点root,求一颗以root为根节点的树使得该树的的总权值最小。是不是觉得很神奇,最小树形图的第一个算法在1965年有中国人朱永津和刘振宏两位发明出来的。想想就激动

 

对最小树形图做个小小的总结:

1:清除自环,自环是不可能存在于任何最小树形图中的,另外清除自环后 其复杂度才能真正为O(VE)

2:求出每个顶点的的最小入边

3:判断该图是否存在最小树形图,由 1 可以判定,或者以图中顶点为v作为根节点遍历该图就能判断是否存在最小树形图

4:找环,之后建立新图,缩点后重新标记

 

引用

 

首先为除根之外的每个点选定一条入边,这条入边一定要是所有入边中最小的。所有的最小入边都选择出来之后就判断,如果这个入边集不存在有向环的话,我们可以证明这个集合就是该图的最小树形图。如果存在有向环的话,我们就要将这个有向环缩成一个人工顶点,同时改变图中边的权。假设某点u在该环上,并设这个环中指向u的边权是in[u],那么对于每条从u出发的边(u, i, w),在新图中连接(new, i, w)的边,其中new为新加的人工顶点; 对于每条进入u的边(i, u, w),在新图中建立边(i, new, w-in[u])的边。然后可以证明,新图中最小树形图的权加上旧图中被收缩的那个环的权和,就是原图中最小树形图的权。 

  现在依据上面的结论,说明一下为什么出边的权不变,入边的权要减去in [u]。对于新图中的最小树形图T,设指向人工节点的边为e。将人工节点展开以后,e指向了一个环。假设原先e是指向u的,这个时候我们将环上指向u的边 in[u]删除,这样就得到了原图中的一个树形图。我们会发现,如果新图中e的权w'(e)是原图中e的权w(e)减去in[u]权的话,那么在我们删除掉in[u],并且将e恢复为原图状态的时候,这个树形图的权仍然是新图树形图的权加环的权,而这个权值正是最小树形图的权值。所以在展开节点之后,我们得到的仍然是最小树形图。逐步展开所有的人工节点,就会得到初始图的最小树形图了。

 

 模版题:http://blog.csdn.net/no_retreats/article/details/7860810

抱歉!评论已关闭.