题意:若干个人开车要去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
。 cost[mp[s1]][mp[s2]]=cost[mp[s2]][mp[s1]]=val; } cin>>car; solve(); cout<<"Total miles driven: "<<sum<<endl; return 0; }