洛谷 1550 最小生成树
生活随笔
收集整理的這篇文章主要介紹了
洛谷 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 最小生成树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据链路层故障诊断与排除
- 下一篇: 系统学习车载仿真测试HiL,成为HiL测