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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

BZOJ_1601_[Usaco2008_Oct]_灌水_(最小生成树_Kruskal)

發布時間:2025/3/15 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ_1601_[Usaco2008_Oct]_灌水_(最小生成树_Kruskal) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

描述


http://www.lydsy.com/JudgeOnline/problem.php?id=1601

有\(n\)個田地需要灌溉,每個田地可以自己引水,花費為\(w[i]\),或者連接其他被灌溉的田地,花費為\(p[i][j]\),求最小花費.

?

分析


我第一眼看以為是dp,發現不對...

如果田地不能自己引水只能和其他田地連接,就是裸的最小生成樹.

這里加了一個可以自己引水,相當于加了一個和所有點都有連邊,且權值分別為\(w[i]\)的結點,然后求\(n+1\)個點的最小生成樹即可.

?

?

1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=300+5; 5 struct edge{ 6 int u,v,w; 7 edge(int u=0,int v=0,int w=0):u(u),v(v),w(w){} 8 bool operator < (const edge &a) const { return w<a.w; } 9 }g[maxn*maxn]; 10 int n,ect,ans; 11 int f[maxn]; 12 inline int read(int &x){ x=0;int k=1;char c;for(c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')k=-1;for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';return x*=k; } 13 inline int find(int x){ return x==f[x]?x:f[x]=find(f[x]); } 14 int main(){ 15 read(n); 16 for(int i=1,w;i<=n;i++) g[++ect]=edge(0,i,read(w)), f[i]=i; 17 for(int i=1;i<=n;i++)for(int j=1,w;j<=n;j++){ 18 read(w); 19 if(j<i) g[++ect]=edge(i,j,w); 20 } 21 sort(g+1,g+ect+1); 22 for(int i=1,j=n;i<=ect&&j;i++){ 23 int fu=find(g[i].u),fv=find(g[i].v); 24 if(fu!=fv) f[fu]=fv, j--, ans+=g[i].w; 25 } 26 printf("%d\n",ans); 27 return 0; 28 } View Code

?

?

?

?

轉載于:https://www.cnblogs.com/Sunnie69/p/5602119.html

總結

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

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