正题
题目链接:https://ac.nowcoder.com/acm/contest/7329/C
题目大意
disx,ydis_{x,y}disx,y表示x,yx,yx,y的所有路径的最短的边的最大值。
求一个1∼n1\sim n1∼n的排列,使得∑i=2ndisi,i−1\sum_{i=2}^ndis_{i,i-1}∑i=2ndisi,i−1最大
解题思路
首先一定是走在最大生成树上的路径
考虑两个已经确定路径的集合,现在合并这两个集合,因为是从大到小枚举的,所以对于合并的这条边显然是走的次数越少越好,那么显然最好是只走一次。
所以其实答案就是最大生成树的权值和。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=5e5+10;
struct node{ll x,y,w;
}a[N];
ll n,m,fa[N],ans;
ll find(ll x)
{return (fa[x]==x)?(x):(fa[x]=find(fa[x]));}
bool cmp(node x,node y)
{return x.w>y.w;}
int main()
{scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++)fa[i]=i;for(ll i=1;i<=m;i++)scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].w);sort(a+1,a+1+m,cmp);ll t=n-1;for(ll i=1;i<=m;i++){ll x=find(a[i].x),y=find(a[i].y);if(x==y)continue;fa[x]=y;t--;ans+=a[i].w;if(!t)break;}printf("%lld",ans);
}