记录编号 344676 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOI 2011]道路修建 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 4.598 s
提交时间 2016-11-10 14:48:43 内存使用 38.44 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1000010;
namespace mine{
//#define NEGATE_NEEDED
    template<class T>inline void readint(T &__x){
        static int __c;
#ifdef NEGATE_NEEDED
        static bool __neg;
#endif
        __x=0;
#ifdef NEGATE_NEEDED
        __neg=false;
#endif
        do __c=getchar();while(__c==' '||__c=='\n'||__c=='\r'||__c=='\t');
#ifdef NEGATE_NEEDED
        if(__c=='-'){
            __neg=true;
            __c=getchar();
        }
#endif
        for(;__c>='0'&&__c<='9';__c=getchar())__x=__x*10+(__c^48);
#ifdef NEGATE_NEEDED
        if(__neg)__x=-__x;
#endif
    }
    template<class T>inline void writeint(T __x){
        static int __a[40],__i,__j;
#ifdef NEGATE_NEEDED
        static bool __neg;
        __neg=__x<0;
        if(__neg)__x=-__x;
#endif
        __i=0;
        do{
            __a[__i++]=__x%10^48;
            __x/=10;
        }while(__x);
#ifdef NEGATE_NEEDED
        if(__neg)putchar('-');
#endif
        for(__j=__i-1;__j^-1;__j--)putchar(__a[__j]);
    }
}
using namespace mine;
struct edge{int to,prev,w;}e[maxn<<1];
void addedge(int,int,int);
void bfs();
int n,last[maxn],len=0,prt[maxn],size[maxn],q[maxn],head,tail,x,y,z;
long long ans=0ll;
int main(){
#define MINE
#ifdef MINE
	freopen("noi2011_road.in","r",stdin);
	freopen("noi2011_road.out","w",stdout);
#endif
	readint(n);
	for(int i=1;i<n;i++){
		readint(x);
		readint(y);
		readint(z);
		addedge(x,y,z);
		addedge(y,x,z);
	}
	bfs();
	writeint(ans);
#ifndef MINE
	printf("\n-------------------------DONE-------------------------\n");
	for(;;);
#else
	fclose(stdin);
	fclose(stdout);
#endif
	return 0;
}
inline void addedge(int x,int y,int z){
	e[++len].to=y;
	e[len].w=z;
	e[len].prev=last[x];
	last[x]=len;
}
void bfs(){
	int x;
	head=tail=1;
	q[tail++]=1;
	while(head!=tail){
		x=q[head++];
		size[x]=1;
		for(int i=last[x];i;i=e[i].prev)if(e[i].to!=prt[x]){
			prt[e[i].to]=x;
			q[tail++]=e[i].to;
		}
	}
	for(int i=n;i;i--){
		size[prt[q[i]]]+=size[q[i]];
	}
	for(int k=1;k<=n;k++)
		for(int i=last[q[k]];i;i=e[i].prev)if(e[i].to!=prt[q[k]])ans+=e[i].w*(long long)abs(n-(size[e[i].to]<<1));
}
/*
6
1 2 1
1 3 1
1 4 2
6 3 1
5 2 1
Answer:
20
*/