poj1639 Picnic Planning 最小度數限制生成樹
題意:若干個人開車要去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