ABC214 D - Sum of Maximum Weights(并查集)

Posted live4m

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ABC214 D - Sum of Maximum Weights(并查集)相关的知识,希望对你有一定的参考价值。

题意:

解法:

考虑每条边的贡献,
假设当前要计算边{a,b,c}的贡献,
那么相当于将边权>=c的其他边都删掉,因为要保证c为边权最大值.
两端点各自连通块城市的数量相乘就是当前边的贡献次数,
贡献次数乘上边权c就是当前边对答案的贡献了.

考虑按从小到大加边,代替删边过程.
这样的话,在加当前边的时候,边权大于当前c的其他边还未加入,
这时候按照上面的做法计算贡献即可.

维护两端点连通块的城市数量可以用并查集.

code:

#include<bits/stdc++.h>
#define int long long
#define PI pair<int,int>
using namespace std;
const int maxm=2e5+5;
struct Node{
    int a,b,c;
}e[maxm];
int pre[maxm];
int cnt[maxm];
int n;
bool cmp(Node a,Node b){
    return a.c<b.c;
}
int ffind(int x){
    return pre[x]==x?x:pre[x]=ffind(pre[x]);
}
void solve(){
    cin>>n;
    for(int i=1;i<n;i++){
        int a,b,c;cin>>a>>b>>c;
        e[i]={a,b,c};
    }
    sort(e+1,e+1+n-1,cmp);
    int ans=0;
    for(int i=1;i<=n;i++){
        pre[i]=i;
        cnt[i]=1;
    }
    for(int i=1;i<n;i++){
        int x=ffind(e[i].a);
        int y=ffind(e[i].b);
        ans+=cnt[x]*cnt[y]*e[i].c;
        pre[x]=y;
        cnt[y]+=cnt[x];
    }
    cout<<ans<<endl;
}
signed main(){
    ios::sync_with_stdio(0);cin.tie(0);
    solve();
    return 0;
}

以上是关于ABC214 D - Sum of Maximum Weights(并查集)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round 108(Problem - D Maximum Sum of Products)

Educational Codeforces Round 108 (Rated for Div. 2) D. Maximum Sum of Products DP

LeetCode 689. Maximum Sum of 3 Non-Overlapping Subarrays

689. Maximum Sum of 3 Non-Overlapping Subarrays

689. Maximum Sum of 3 Non-Overlapping Subarrays

689. Maximum Sum of 3 Non-Overlapping Subarrays