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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

问题 B: PK吹泡泡(Kruscal)

發布時間:2024/9/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 问题 B: PK吹泡泡(Kruscal) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題 B: PK吹泡泡
時間限制: 1 Sec 內存限制: 128 MB

[提交][狀態][討論版]
題目描述
經歷了一天的訓練之后, PK準備放松一下,在草坪上吹起了泡泡。經歷了 PK 的一頓操作之后,天空中出現了 n 個泡
泡,每個泡泡都有個編號。 給出了m個關系,每個關系以u v w 的形式給出,表示編號為u的泡泡可以和編號為v的
泡泡連在一起,且花費的代價為 w。
這時, PK 想到了一個問題:如何以最小的代價把這 n 個泡泡中的一些泡泡連在一起,使得天空中出現 k 個泡泡聯通
塊?可是PK沉浸在了泡泡的海洋無法自拔,不想思考這個問題,他希望你來替他回答。
輸入
第一行三個整數 n,m,k (1 ≤ k < n ≤ 1000, 1 ≤ m ≤ 500000 )。表示泡泡的個數,PK 給出的關系數以及最終要
形成的泡泡聯通塊數。
接下來的m行 ,每行三個數 u,v,w(1 ≤ u, v ≤ n, 0 < w ≤ 1000000 ) ,表示你可以把泡泡 u 和泡泡 v 連在一起,需要
花費的代價為 w。

輸出
輸出一個整數,表示把這n個泡泡中的一些泡泡連在一起使得天空中出現k個泡泡聯通塊的最小代價

樣例輸入

4 4 2 1 2 1 2 3 4 3 4 2 1 4 5

樣例輸出

3

提示
數據保證有解

數據保證圖聯通

/*
認真讀題,再畫出樣例,其實這題就是一個最小生成樹,用Kruscal,開始時,有多少個點就要多少個聯通塊,每次選定一條邊,聯通塊個數就會少一個。
所以用Kruscal選邊,直到連通塊只剩K個即可返回最小代價。
*/
Ac_code:

#include <bits/stdc++.h> using namespace std; typedef long long LL; const LL maxn = 5e5+2; struct Edge {LL s,e;LL val;bool operator<(const Edge x)const{return val<x.val;} }a[maxn]; LL pre[maxn]; LL myFind(LL x) {return pre[x]==x?x:pre[x]=myFind(pre[x]); } LL kruscal(LL n,LL m,LL k) {for(LL i = 1; i <= n; i++){pre[i] = i;}sort(a,a+m);LL sum = 0,cnt = 0;for(LL i = 0; i < m; i++){LL fx = myFind(a[i].s);LL fy = myFind(a[i].e);if(fx != fy){pre[fx]=pre[fy];sum += a[i].val;cnt++;if(n-cnt == k){return sum;}}} } int main() {LL n,m,k;scanf("%lld%lld%lld",&n,&m,&k);for(LL i = 0; i < m; i++){scanf("%lld%lld%lld",&a[i].s,&a[i].e,&a[i].val);}printf("%lld\n",kruscal(n,m,k));return 0; }

總結

以上是生活随笔為你收集整理的问题 B: PK吹泡泡(Kruscal)的全部內容,希望文章能夠幫你解決所遇到的問題。

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