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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

洛谷 1550 最小生成树

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

? 首先因為這題是連通性問題求最值,考慮最小生成樹是否可做,這題一個比較不同的地方是它每一個點有權值,我們考慮能否將點的權值轉化成邊權,因為如果能夠轉化成功,我們就可以很輕松的用最小生成樹求解,我們可以建立一個新的虛擬節點,并將所有的點與這個點連一條邊權為那些點點權的邊,然后在新圖中求最小生成樹即可

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define maxn 100005 struct edge {int fr,to,cost; }e[maxn]; int n,tot,cnt,father[maxn],ans;bool cmp(edge a,edge b) {return a.cost<b.cost; }int getfather(int x) {if (x!=father[x]) x=getfather(father[x]);return father[x]; }int main() {scanf("%d",&n);for (int i=1;i<=n;i++) {e[++tot].fr=0;e[tot].to=i;scanf("%d",&e[tot].cost); }for (int i=1;i<=n;i++)for (int j=1;j<=n;j++) {int a;scanf("%d",&a);if (a==0) continue;e[++tot].fr=i;e[tot].to=j;e[tot].cost=a; }sort(e+1,e+tot+1,cmp);for (int i=1;i<=n;i++) father[i]=i;for (int i=1;i<=tot;i++){int x=e[i].fr;int y=e[i].to;x=getfather(x);y=getfather(y);if (x==y) continue;father[x]=y;ans+=e[i].cost;cnt++;if (cnt==n) break; }printf("%d\n",ans);return 0; }


總結

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

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