题目链接
http://www.lydsy.com/JudgeOnline/problem.php?id=2435
大水题,无根树随便找个点当成根然后DFS出一个有根树,统计下每个子树的大小,然后扫一遍树边统计答案就OK了。本来可以做到1A的,没想到在int赋值给long long时还要加个强制转换,结果贡献2个WA,什么鬼啊,教训一定要切记!
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <cmath>
#define MAXN 1000100
using namespace std;
typedef long long int LL;
struct edge
{
int u,v,w,next;
}edges[MAXN*2];
int head[MAXN],nCount=0;
void AddEdge(int U,int V,int W)
{
edges[++nCount].u=U;
edges[nCount].v=V;
edges[nCount].w=W;
edges[nCount].next=head[U];
head[U]=nCount;
}
int size[MAXN]; //size[i]=子树i的大小
void DFS(int u,int fa)
{
size[u]=1;
for(int p=head[u];p!=-1;p=edges[p].next)
{
int v=edges[p].v;
if(v==fa) continue;
DFS(v,u);
size[u]+=size[v];
}
}
int n;
inline int cal(int u,int v)
{
if(size[u]<size[v]) swap(u,v); //保证size[u]>size[v],即u是v的父亲
return abs((n-size[v])-size[v]);
}
int main()
{
LL ans=0;
memset(head,-1,sizeof(head));
scanf("%d",&n);
for(int i=1;i<n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
AddEdge(u,v,w);
AddEdge(v,u,w);
}
DFS(1,-1);
for(int i=1;i<=nCount;i+=2)
ans+=(LL)edges[i].w*cal(edges[i].u,edges[i].v); //!!!!!!!什么鬼!!!!!!!!!
printf("%lld\n",ans);
return 0;
}