注意这几点:
1.一个路径上最小的重量才是这条路径的重量
2.从大到小排序后,每次都取可以连接的里最大的,所得结果就为能得到的最大的
3.两个点集哪种情况为父的重量大,就采取哪种情况
4.边权的范围是100,000,点的范围是20,000,所以乘起来会超出int,要记得用(long long)转换
#include<stdio.h>
#include<algorithm>
using namespace std;
struct stage
{
int st,ed,w;
}edge[200005];
struct point
{
int tot,p;
long long value;
}po[200005];
int cmp(stage a,stage b)
{
return a.w>b.w;
}
int find(int n)
{
if(n!=po[n].p)
{
po[n].p=find(po[n].p);
}
return po[n].p;
}
int main()
{
int n,a,b,c;
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
po[i].p=i;
po[i].tot=1;
po[i].value=0;
}
for(int i=1;i<n;i++)
{
scanf("%d%d%d",&edge[i].st,&edge[i].ed,&edge[i].w);
}
sort(edge+1,edge+n,cmp);
long long ans=0;
for(int i=1;i<n;i++)
{
int pa=find(edge[i].st);
int pb=find(edge[i].ed);
long long atob=po[pb].value+(long long)edge[i].w*po[pa].tot;
long long btoa=po[pa].value+(long long)edge[i].w*po[pb].tot;
if(atob>btoa)
{
po[pa].p=pb;
po[pb].tot+=po[pa].tot;
po[pb].value=atob;
if(ans<atob)
{
ans=atob;
}
}
else
{
po[pb].p=pa;
po[pa].tot+=po[pb].tot;
po[pa].value=btoa;
if(ans<btoa)
{
ans=btoa;
}
}
}
printf("%lld\n",ans);
}
}