日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 5441 (并查集)

發布時間:2023/12/9 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 5441 (并查集) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:給你n個點,m條邊構成無向圖。q個詢問,每次一個值,求有多少條路,路中的邊權都小于這個值

a->b 和 b->a算兩種

思路:把權值從小到大排序,詢問從小到大排序,如果相連則用并查集相連形成聯通塊

x個點可以形成:x * (x - 1)

如果新增的路使兩個聯通塊和并則數量 增長了:

(num[1]+num[2])×(num[1]+num[2]-1) - num[1] × (num[1]-1) - num[2] ×(num[2]-1)


#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<string> #include<map> #include<set> #include<vector> #include<queue> #include<stack> using namespace std; typedef long long ll; int T,n,m,k; int num[20005],par[20005],p[20005];struct node {int u,v,w;bool operator<(const node&a)const{return w < a.w;} } pnode[100005];struct term {int id,we;bool operator<(const term&a)const{return we<a.we;} } te[20005];int fin(int x) {return x == par[x]? x : par[x] = fin(par[x]); }void merg(int x,int y) {int x1 = fin(x);int x2 = fin(y);if(x1 < x2){par[x2]= x1;num[x1] += num[x2];}else{par[x1] = x2;num[x2] += num[x1];} }int main() {scanf("%d",&T);while(T--){scanf("%d%d%d",&n,&m,&k);for(int i = 0; i <= n; i++){par[i] = i;num[i] = 1;}for(int i = 0; i < m; i++)scanf("%d%d%d",&pnode[i].u,&pnode[i].v,&pnode[i].w);sort(pnode,pnode+m);for(int i = 0; i < k; i++){te[i].id = i;scanf("%d",&te[i].we);}sort(te,te+k);int tt = 0;ll ans = 0;for(int i = 0; i < k; i++){while(tt < m && pnode[tt].w <= te[i].we ){int u = fin(pnode[tt].u);int v = fin(pnode[tt].v);tt++;if(u == v)continue;ans += (num[u]+num[v])*(num[u]+num[v]-1)-num[u]*(num[u]-1) - num[v]*(num[v]-1);merg(u,v);}p[te[i].id] = ans;}for(int i = 0;i <k;i++)printf("%d\n",p[i]);}return 0; }

  

轉載于:https://www.cnblogs.com/Przz/p/5409758.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的hdu 5441 (并查集)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。