您的位置:首页 > 其它

2435: [Noi2011]道路修建

2018-07-08 15:09 288 查看

2435: [Noi2011]道路修建

 

https://www.lydsy.com/JudgeOnline/problem.php?id=2435

 

 

/*

开始读错题了,以为顺序修建给定的边,计算费用,算的样例是12。
每条边的权值就是两边的点的差的绝对值*这条边的长度。
dfs一遍

*/

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

inline int read() {
int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
for (;isdigit(ch);ch=getchar())x=x*10+ch-'0';return x*f;
}

const int N = 1000005;
int head
,nxt[N<<1],to[N<<1],val[N<<1],siz
,Enum,Sum;
LL Ans; // ---

inline void add_edge(int u,int v,int w) {
++Enum;to[Enum] = v, val[Enum] = w, nxt[Enum] = head[u],head[u] = Enum;
}
void dfs(int u,int fa) {
siz[u] = 1;
for (int i=head[u]; i; i=nxt[i]) {
int v = to[i];
if (v == fa) continue;
dfs(v,u);
siz[u] += siz[v];
Ans += 1ll * abs(Sum - siz[v] - siz[v]) * val[i];
}
}
int main() {
int n = read();Sum = n;
for (int i=1; i<n; ++i) {
int u = read(),v = read(),w = read();
add_edge(u,v,w);add_edge(v,u,w);
}
dfs(1,0);
cout << Ans;
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: