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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【最小生成树】灌水

發布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【最小生成树】灌水 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

灌水

題目大意

給你n個點,你可以在某個點建水庫(生產水),或從其他有水的點建水管送過來
現在問你讓所有點都有水的最小代價是多少

輸入樣例

4 5 4 4 3 0 2 2 2 2 0 3 3 2 3 0 4 2 3 4 0

輸出樣例

9

樣例解釋

FarmerJohnFarmer JohnFarmerJohn在第四塊土地上建立水庫,然后把其他的都連向那一個,這樣就要花費3+2+2+2=9

數據范圍

對于20%20\%20%的數據,n?10n\leqslant 10n?10
對于60%60\%60%的數據,n?100n\leqslant 100n?100
對于100%100\%100%的數據,n?300,wi?100000,pi,j?100000,pi,j=pj,i,pi,i=0n\leqslant 300,w_i\leqslant 100000,p_{i,j}\leqslant 100000,p_{i,j}=p_{j,i},p_{i,i}=0n?300,wi??100000,pi,j??100000,pi,j?=pj,i?,pi,i?=0

解題思路

創一個點0
讓所有點都連向0,邊權為這個點建水庫的代價
然后跑最小生成樹即可

代碼

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long using namespace std; ll n, x, tot, ans, fa[310]; struct rec {ll x, y, l; }a[90100]; void add(ll x, ll y, ll z) {a[++tot].x = x;a[tot].y = y;a[tot].l = z; } bool cmp(rec x, rec y) {return x.l < y.l; } ll find(ll x) {return x == fa[x]?x:fa[x] = find(fa[x]); } int main() {scanf("%lld", &n);for (ll i = 1; i <= n; ++i){scanf("%lld", &x);fa[i] = i;add(0, i, x);//連向0}for (ll i = 1; i <= n; ++i)for (ll j = 1; j <= n; ++j){scanf("%lld", &x);if (i == j) continue;add(i, j, x);}sort(a + 1, a + 1 + tot, cmp);//最小生成樹for (ll i = 1; i <= tot; ++i)if (find(a[i].x) != find(a[i].y)){fa[fa[a[i].x]] = fa[a[i].y];ans += a[i].l;}printf("%lld", ans);return 0; }

總結

以上是生活随笔為你收集整理的【最小生成树】灌水的全部內容,希望文章能夠幫你解決所遇到的問題。

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