题意:若干个人开车要去park聚会,但是park能停的车是有限的,为k。所以这些人要通过先开车到其他人家中,停车,然后拼车去聚会。另外,车的容量是无限的,他们家停车位也是无限的。求开车总行程最短。
就是求一最小生成树,但是对于其中一个点其度不能超过k。
思路:
1. 将park点取出 将剩下的点求出最小生成树 出现i个联通块
2. 再每个块中选择与park点相邻的最小边
到此park点已经连了i条边
park点最大可以连接k个点
得到Sum值
3. 需要求出i+1-->k 条的Sum值
每次添加一条边在树上形成一个环 然后 删去一条环上的边(权值最大)取Sum=min(Sum,Sum+添加边-删去边) 复杂度O(n^2)
因为第三步复杂度高需要优化第三步
优化:先记录Vi->Vp路径上且不与Vp直接相连的边的权值的Max[ i ]
添加边时 取cost(Vi,Vp)-Max [ i ]最小值 添加(Vi,Vp)边
再枚举ViVp原有的路径上不与Vp相连的边,找到最大权值的边;
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std; const int maxn =111+5; const int maxe = 15000+5; const int INF = 460002326; #include