jzoj2940-生成输入数据【最小生成树,并查集】
生活随笔
收集整理的這篇文章主要介紹了
jzoj2940-生成输入数据【最小生成树,并查集】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目大意
給一個完全圖的唯一一顆最小生成樹,求完全圖最小邊權之和。
解題思路
我們考慮在計算最小生成樹的時候,將兩個聯通塊合并時,我們會選擇連接這兩個聯通塊的最小的邊。
那么我們就可以讓每個聯通塊合并時,讓其他邊都是比這個給出的邊邊權+1的就好了。
codecodecode
#include<cstdio> #include<algorithm> #define ll long long #define N 20010 using namespace std; struct node{ll from,to,w; }a[N]; ll ans,fa[N],s[N],t,n; ll find(ll x){if(fa[x]==x) return x;return fa[x]=find(fa[x]); } bool cmp(node x,node y){return x.w<y.w; } int main() {scanf("%lld",&t);while(t--){ans=0;scanf("%lld",&n);for(ll i=1;i<n;i++){scanf("%lld%lld%lld",&a[i].from,&a[i].to,&a[i].w);ans+=a[i].w;}for(ll i=1;i<=n;i++)fa[i]=i,s[i]=1;sort(a+1,a+n,cmp);for(ll i=1;i<n;i++){ll Fa=find(a[i].from),Fb=find(a[i].to);ans+=(s[Fa]*s[Fb]-1)*(a[i].w+1);fa[Fb]=Fa;s[Fa]+=s[Fb];}printf("%lld\n",ans);} }總結
以上是生活随笔為你收集整理的jzoj2940-生成输入数据【最小生成树,并查集】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王者荣耀高冷撩妹名字 王者荣耀高冷名字分
- 下一篇: jzoj3771-小Z的烦恼【高精度,数