關鍵是利用「所有從s到t的路徑上的最長邊的最小值」這個條件,我們所要的只是這個最小值:
對於(s,t),這個最小值一定是s到t的最短路上的最長邊,則所有可能被取到的邊是最小生成樹上的邊
因為最小生成樹利用的就是貪心,樹上的邊都是圖上每兩點間的最短路會經過的邊
實現:在kruskal的過程中,新增一條邊,權值為w,兩個連通分量u和v變為連通,有num[u]*num[v]*2對pair會取到這個w,因為(s,t)和(t,s)不同所以*2
統計,對於乙個f,對所有t<=f的guests更新
#include #include #include #include #include using namespace std;
#define n 10010
#define m 500500
struct edge
edge[m];
bool cmp(edge u,edge v)
}q[n*14];
bool cmp2(q u,q v)
if(q[left].val>f) return;
q[0].val+=val;
q[left].val-=val;
}int main ()
for(int i=0,k=0;i
hdu 1863 最小生成樹
使用並查集,陣列不要太小 include stdio.h int set 200 int n,m typedef struct nodenode,pnode node road 200 void init int find int u return set u int join int u,int ...
hdu 4081 最小生成樹
先求出最小生成樹,然後列舉樹上的邊,對於每條邊 分別 找出這條割邊形成的兩個塊中點權最大的兩個 1.由於結果是a b,a的變化會引起b的變化,兩個制約,無法直接貪心出最大的a b,故要通過列舉 2.不管magic road要加在 加的邊是否是最小生成樹上的邊,都會產生環,我們都要選擇一條邊刪掉 注意...
hdu 1863(最小生成樹)
基礎的最小生成樹問題,不過 要特判條件不足的情況 include include define inf 1 30 int n,m,vis 110 low 110 int map 110 110 int init int prim if pos 1 return 1 代表這當前步驟缺少條件 int k...