Conquer a New Region, ACM/ICPC Changchun 2012, UVa1664

来源:互联网 发布:java中ioc是什么 编辑:程序博客网 时间:2024/06/04 18:23
#include<cstdio>#include<iostream>#include<cmath>#include<algorithm>#include<cstring>using namespace std;#define maxn 200010int n;typedef long long LL;struct edge{int u,v,c;bool operator < (const edge _t)const{return c>_t.c;}}e[maxn<<1];int idx,fa[maxn],cnt[maxn];LL sum[maxn];void adde(int u,int v,int c){idx++;e[idx].u=u;e[idx].v=v;e[idx].c=c;}int find(int u){return fa[u]==u?fa[u]:fa[u]=find(fa[u]);}int main(void){int a,b,c,fx,fy;LL sa,sb;while(scanf("%d",&n)!=EOF){idx=0;for(int i=1;i<n;i++){scanf("%d%d%d",&a,&b,&c);adde(a,b,c);}for(int i=1;i<=n;i++)sum[i]=0,cnt[i]=1,fa[i]=i;sort(e+1,e+n);LL ans = 0;for(int i=1;i<n;i++){a = e[i].u,b = e[i].v;fx = find(a),fy = find(b);sa = (LL)cnt[fy]*e[i].c+sum[fx];sb = (LL)cnt[fx]*e[i].c+sum[fy]; if(sa>sb){fa[fy] = fx;sum[fx] = sa;cnt[fx]+=cnt[fy];}else{fa[fx] = fy;sum[fy] = sb;cnt[fy]+=cnt[fx];}ans = max(ans,max(sa,sb));}printf("%lld\n",ans);}return 0;}
并查集..

1 0