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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

洛谷 P1967货车运输 并查集+贪心 不需要用LCA!

發(fā)布時(shí)間:2023/12/3 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷 P1967货车运输 并查集+贪心 不需要用LCA! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接

題目鏈接

題解

要求所有的路徑中最小邊長的最大值!

我們貪心的加邊,依照邊從大往小的方式往里添加,然后合并并查集。
每次當(dāng)查詢分布在兩個(gè)待合并的并查集的時(shí)候,當(dāng)前的邊長就是這次查詢的答案。

我們對每個(gè)并查集維護(hù)一個(gè)集合,集合中保存的內(nèi)容就是一個(gè)點(diǎn)在這個(gè)并查集中,而另一個(gè)點(diǎn)不在這個(gè)并查集中的詢問編號。

當(dāng)待合并的兩個(gè)并查集所具有的集合里面擁有相同的詢問編號時(shí)候,回答這個(gè)詢問編號,然后把小的集合向大的集合合并,并將回答完的詢問編號從集合中移除。

這是一個(gè)離線算法。

代碼

#include <bits/stdc++> using namespace std; int n,m,q; set<int>::iterator it; const int maxm = 50005; const int maxn = 11111; set<int> Q[11111]; struct edge{int u,v,cost;friend bool operator <(edge e1,edge e2){return e1.cost > e2.cost;} }es[maxm]; int ans[maxm]; int parent[maxn]; int find(int x){return x == parent[x]?x:parent[x] = find(parent[x]); } int main(){memset(ans,-1,sizeof(ans));for(int i = 1;i < maxn;++i)parent[i] = i;scanf("%d%d",&n,&m);for(int i = 0;i < m;++i)scanf("%d%d%d",&es[i].u,&es[i].v,&es[i].cost);sort(es,es+m);scanf("%d",&q);for(int i = 0;i < q;++i){int x,y;scanf("%d%d",&x,&y);Q[x].insert(i);Q[y].insert(i);}for(int i = 0;i < m;++i){int x = es[i].u,y = es[i].v,c = es[i].cost;int px = find(x),py = find(y);if(px == py) continue;else{if(Q[px].size() > Q[py].size())swap(px,py);vector<int> tmp;for(it = Q[px].begin();it != Q[px].end();++it){int id = *it;if(Q[py].count(id)){ans[id] = c;tmp.push_back(id);}Q[py].insert(id);}for(int i = 0;i < tmp.size();++i)Q[py].erase(tmp[i]);parent[px] = py;}}for(int i = 0;i < q;++i)printf("%d\n",ans[i]); } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的洛谷 P1967货车运输 并查集+贪心 不需要用LCA!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。