hdu4424

来源:互联网 发布:青海干部教育网络平台 编辑:程序博客网 时间:2024/06/06 09:58
/*
分析:
    并查集(2012长春现场赛E题)。
    蛋疼的再次爆栈了,囧~~
    意外的在Statistic排了第一耶,625MS。太意外了,囧~~~
    很巧妙的想法,由于路径的容量只与最小边有关,所
以把边从大到小排序,然后并查集,合并两个集合的时候
取max,就行了。
   
                                              2012-10-24
*/














#pragma comment(linker, "/STACK:1024000000,1024000000")#include"stdio.h"#include"string.h"#include"stdlib.h"struct Eage{    int a,b;    __int64 len;}eage[200111];int pre[200111];int num[200111];__int64 sum[200111];int cmp(const void *a,const void *b){    struct Eage *c,*d;    c=(struct Eage *)a;    d=(struct Eage *)b;    return d->len-c->len;}void build(int n){    int i;    for(i=1;i<=n;i++)   {pre[i]=i;num[i]=1;sum[i]=0;}}int find(int k){    if(pre[k]==k)   return k;    pre[k]=find(pre[k]);    return pre[k];}void Union(int f1,int f2,__int64 dir){    pre[f1]=f2;    num[f2]+=num[f1];    sum[f2]+=dir;}int main(){    int n,t;    int i,l;    int f1,f2;    long long dir1,dir2;    while(scanf("%d",&n)!=-1)    {        build(n);        t=n-1;        for(i=0;i<t;i++)    scanf("%d%d%I64d",&eage[i].a,&eage[i].b,&eage[i].len);        qsort(eage,t,sizeof(eage[0]),cmp);        for(i=0;i<t;i++)        {            f1=find(eage[i].a);            f2=find(eage[i].b);            if(f1==f2)  continue;dir1=num[f2]*eage[i].len+sum[f1];dir2=num[f1]*eage[i].len+sum[f2];            if(dir1>dir2) Union(f2,f1,dir1-sum[f1]);            else          Union(f1,f2,dir2-sum[f2]);        }        printf("%I64d\n",sum[find(1)]);    }    return 0;}


原创粉丝点击