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