題目傳送門:
題目的題意有些不清楚,看了discuss才明白。定義圖上一條路徑的cost為路徑中所有邊權中最大的那個。對於給定的圖,回答當最大的路徑長度為l的時候,最多可以有多少頂點對是可及的。
按照kruskal的思路,按邊權從小到大連線頂點,每次相連,如果減少乙個連通分量,那麼可及頂點對就會增大,增大的個數就是原來兩個連通分量頂點個數的乘積,不斷累加就可以得到對於不同的l,一共有多少頂點對。
#include
#include
#include
#include
using namespace std;
const int m = 5e4 + 5;
const int n = 1e4 + 5;
int father[n], sum[n], ans[n];
int n, m, t;
struct edge e[m];
struct query q[n];
bool cmp(const edge &e1, const edge &e2)
bool cmp1(const query &q1, const query &q2)
int find(int
x) returnx;}
int merge(int
x, int
y) else
return0;}
void init(void)
}int main()
sort(e + 1, e + 1 + m, cmp);
for (int i = 1; i <= t; i ++)
sort(q + 1, q + 1 + t, cmp1);
int cnt = 0, j = 1;
for (int i = 1; i <= t; i ++)
ans[q[i].id] = cnt;
}for (int i = 1; i <= t; i ++)
}return
0;}
HDOJ 3938 Portal 離線並查集
給出乙個帶邊權的圖,令兩個點之間的路徑的費用為中途經過的邊的最大值,對每個查詢求有多少對點路徑費用小於等於給定的l。用類似kruskal的思想,每個點都設定乙個sum陣列表示它所相連的所有滿足小於當前l的邊相連的點有多少個 其實陣列名用size更合適 然後對於每次查詢l,因為邊我們也是公升序排序的,...
並查集,帶權並查集
題意 ignatius過生日,客人來到,他想知道他需要準備多少張桌子。然而一張桌子上面只能坐上相互熟悉的人,其中熟悉可定義成為a與b認識,b與c認識,我們就說a,b,c相互熟悉 例如a與b熟悉and b與c熟悉,d與e熟悉,此時至少需要兩張桌子。輸入 t表示樣例個數,n表示朋友個數,朋友從1到n編號...
帶權並查集
食物鏈 time limit 1000ms memory limit 10000k total submissions 71395 accepted 21146 description 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n...