• https://loj.ac/problem/10067
  • 思路:跑一遍kruskal,并查集处理时添加新变量cnt[x]、cnt[y]存点数:cnt[i]=1,cnt[fv]+=cnt[fu];ans+=(cnt[fu]*cnt[fv]-1)*(e[i].w+1);
  • 代码:
    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    struct node{
        ll u,v,w;
    }e[100005];
    ll fa[100005],cnt[100005],cntx,cnty,w,ans;
    ll cmp(node x,node y){
        if(x.w<y.w) return 1;
        return 0;    
    };
    ll getfather(ll q){
        if(fa[q]!=q){
            fa[q]=getfather(fa[q]);
        }
        return fa[q];    
    }
    int main(){
        ll n;
        cin>>n;
        for(ll i=1;i<n;i++){
            ll x,y,z;
            cin>>x>>y>>z;
            e[i].u=x;e[i].v=y;e[i].w=z;
            ans+=e[i].w;
        }
        sort(e+1,e+n,cmp);
        for(ll i=1;i<=n;i++){
            fa[i]=i;
            cnt[i]=1;
        }
        ll fu,fv,s=0;
        for(ll i=1;i<=n;i++){
            fu=getfather(e[i].u);
            fv=getfather(e[i].v);
            if(fu!=fv){
                s++;
                ans+=(cnt[fu]*cnt[fv]-1)*(e[i].w+1);
                cnt[fv]+=cnt[fu];
                fa[fu]=fv;
            }
            if(s==n-1)break;
        }
        cout<<ans<<endl;
        return 0;
    }

     

相关文章:

  • 2021-08-31
  • 2022-12-23
  • 2022-12-23
  • 2022-02-02
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-07-08
  • 2021-06-15
  • 2021-12-17
  • 2021-07-31
  • 2021-10-14
相关资源
相似解决方案