CodeForces 893C (並查集板子題)

2021-10-23 07:10:28 字數 1038 閱讀 6256

刷題刷到自閉,寫個部落格放鬆一下

題意:n個人,m對朋友,每尋找乙個人傳播訊息需要花費相應的價錢,朋友之間傳播訊息不需要花錢,問最小的花費

把是朋友的歸到一起,求朋友中花錢最少的,將所有最少的加起來。

1 #include2 #include3 #include4 #define ll long long

5 using namespace std;

6 7 ll a[1000100];

8 9 struct lll

10 p[100100];

13 14 int cmp(lll x,lll y)

15 19

20 ll find(ll x)

21 25

26 void unionn(ll x,ll y)

27 34 else p[fb].par=fa;

35 if(p[fa].c==p[fb].c) p[fa].c++;

36 }

37 38 int main()

39 50 ll x,y;

51 for(ll i=0;i55 ll sum=0;

56 for(int i=1;i<=n;i++)

57 while(p[i].par!=i&&p[p[i].par].par!=p[i].par) //是同一類但是頭不是老大 把頭變為老大;

58 p[i].par=p[p[i].par].par;

59 sort(p+1,p+n+1,cmp); //把結構體按類排序,主要是同一類的花費少的在前

60 sum=p[1].b;

61 for(int i=2;i<=n;i++)

64 printf("%lld\n",sum);

65 }

66 return 0;

67 }

codeforces 731C 並查集 水

題意 給出n只襪子的顏色,每天選擇兩隻襪子,每次能把乙隻襪子染色。問最少染色幾隻襪子能使的每天的襪子顏色一樣。給每天穿的兩隻襪子連邊,很顯然乙個分量的襪子要一起考慮,並查集維護分量就好了。然後搜出最多的顏色,把分量的點都染成這個顏色即可。include include include include...

CodeForces 455C (貪心,並查集)

題意 給出乙個n個點m條邊的森林,q次詢問,第一種詢問要求輸出乙個點所在樹的直徑,第二種詢問要求合併兩個點所在的樹。思路 先將初始的森林中各個樹的直徑求出來,然後用並查集維護。兩樹合併時,設直徑分別為len1,len2,新樹直徑為max len1,len2,len1 2 len2 2 len1 2 ...

Codeforces 722C 並查集 思維

思路 題目給的運算元從第 1 個到第 n 個數是刪除原陣列中的乙個數,那麼反過來從後往前就是增加原陣列中的乙個數,每增加乙個值,那麼就有四種情況 第一種和前後都不連續,即自成乙個集合 第二種 和前面的數連續,即和前乙個數在乙個集合 第三種和之後乙個數連續,即和之後的乙個數在乙個集合 第四種既和前面乙...