生成树相关问题
回路性质:如果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) 就是最小生成树的权值了