生成树相关问题

回路性质:如果C是图G上的任意回路, e是回路上权值最大的边, 那么生成树肯定不包含e, 因为选其他的边,明显更优

增量最小生树, 有m条边,每次加入一条边,如果能形成树,求出最小的生成树,

思路:

  如果暴力求解,那么要求m遍最小生成树, 时间复杂度是 m*m*logm

  那么根据回路性质,  一棵树加入一条边后,肯定形成一个环, 所以只要删除环上权值最大的边即可

  假设加的边是u--v , 那么只要找到u到v路径上的最大权值和新边的权值比较, 去除大的即可。

  时间复杂度是O(n*m),  需要维护一棵树, 所以用手写的邻接表来存储比较好,  dfs时找到权值最大的边存储的下标,

  然后替换边的时候,也好替换。

 

最小瓶颈生成树:求生成树, 是的最大边的权值最小。  其实就是就是最小生成树

 

最小瓶颈路:给定加权图G,求出任意两个节点u->v的一条路径, 使得路径上的最大边权最小。要使得最大权值最小, 那么其实就是求最小生成树

      然后任意两点之间路径的最大边权, 可以用dfs来求。

次小生成树:权值之和排在第二位的生成树,叫错次小生成树

 求出任意两点的最小瓶颈路,  maxCost[u][v]  ,那么当加入边u,v后    形成环, 删除maxCost[u][v]对应的边,那么现在生成树的权值为

total - maxCost[u][v] + w(u,v)   

枚举不在生成树中的边, 然后找到最小的total - maxCost[u][v] + w(u,v)   就是最小生成树的权值了

posted @ 2015-07-29 20:07  justPassBy  阅读(239)  评论(0编辑  收藏  举报