首页 > 代码库 > bzoj 2435
bzoj 2435
http://www.lydsy.com/JudgeOnline/problem.php?id=2435
noi 你为什么那么diao, 这种世纪水题刷一道少一道啊。。。 我原来还以为是两边的联通块大小按已经连接上的点来算,然后发现是按照最后的联通块来算的(‘ ‘ ) 直接每个点 abs(n - 2 * size[x]) * dis(边权)
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int maxn = 1000100;struct edge { int t, d; edge* next;}e[maxn * 2], *head[maxn]; int ne = 0;int n, m;void addedge(int f, int t, int d) { e[ne].t = t, e[ne].d = d, e[ne].next = head[f], head[f] = e + ne ++; }int sta[maxn], top = 0, size[maxn], dis[maxn];void dfs(int x, int fa) { sta[++ top] = x; size[x] = 1; for(edge* p = head[x]; p; p = p-> next) { if(p-> t != fa) dis[p-> t] = p-> d, dfs(p-> t, x), size[x] += size[p-> t]; }}int int_get() { int x = 0; char c = (char)getchar(); bool f =0 ; while(!isdigit(c)) { if(c == ‘-‘) f = 1; c = (char)getchar(); } while(isdigit(c)) { x = x * 10 + (int)(c - ‘0‘); c = (char)getchar(); } if(f) x = -x; return x;}void read() { n = int_get(); for(int i = 1; i < n; ++ i) { int u, v, w; u = int_get(), v = int_get(), w = int_get(); addedge(u, v, w), addedge(v, u, w); }}long long ans = 0;void sov() { dfs(1, 0); for(int i = top; i >= 2; -- i) { ans += (long long)(abs(n - 2 * size[sta[i]])) * (long long)dis[sta[i]]; } printf("%lld\n", ans);}int main() { //freopen("test.in", "r", stdin); read(), sov(); return 0;}
bzoj 2435
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。