P2052 [NOI2011]道路修建——树形结构(水题,大佬勿进)
P2052 [NOI2011]道路修建
这个题其实在dfs里面就可以把事干完的,(我一开始还拿出来求了一把)……
一条边的贡献就是儿子的大小和n-siz[v]乘上边权;
#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=1e6+10; typedef long long ll; int pre[maxn*2],last[maxn],other[maxn*2],len[maxn*2],l; void add(int x,int y,int z) { l++; pre[l]=last[x]; last[x]=l; other[l]=y; len[l]=z; } int n; int father[maxn]; int siz[maxn]; ll ans; void dfs(int x,int fa) { siz[x]=1; for(int p=last[x];p;p=pre[p]) { int v=other[p]; if(v==fa) continue; dfs(v,x); ans+=(ll)abs(n-2*siz[v])*len[p]; siz[x]+=siz[v]; } } int main() { scanf("%d",&n); for(int i=1;i<n;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } dfs(1,1); printf("%lld",ans); return 0; }