标签:frame define 一点 using under href 思路 操作 nbsp
http://codeforces.com/problemset/problem/274/B
给出一棵树,每个点有权值,每次操作可以对一个联通子集中的点全部加1,或者全部减1,且每次操作必须包含点1,问最少通过多少次操作可以让整棵树每个点的权值变为0.
http://blog.csdn.net/qq_24451605/article/details/48622953
神奇啊,这样的转换 我想不到啊...orz,1这个根节点连接所有的修改,父节点修改的次数是子节点的最大值,这样就把联通子集通过1神奇的联系在一起。
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 #define MS(a) memset(a,0,sizeof(a)) 5 #define MP make_pair 6 #define PB push_back 7 const int INF = 0x3f3f3f3f; 8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL; 9 inline ll read(){ 10 ll x=0,f=1;char ch=getchar(); 11 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} 12 while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} 13 return x*f; 14 } 15 ////////////////////////////////////////////////////////////////////////// 16 const int maxn = 1e5+10; 17 18 vector<int> g[maxn]; 19 int n; 20 ll a[maxn],up[maxn],down[maxn]; 21 22 void dfs(int u,int fa){ 23 for(int i=0; i<(int)g[u].size(); i++){ 24 int v = g[u][i]; 25 if(v == fa) continue; 26 dfs(v,u); 27 up[u] = max(up[u],up[v]); 28 down[u] = max(down[u],down[v]); 29 } 30 a[u] = a[u]+up[u]-down[u]; 31 if(a[u] > 0) down[u] += a[u]; 32 else up[u] -= a[u]; 33 } 34 35 int main(){ 36 cin >> n; 37 for(int i=1; i<n; i++){ 38 int u,v; cin>>u>>v; 39 g[u].push_back(v); 40 g[v].push_back(u); 41 } 42 for(int i=1; i<=n; i++) 43 cin >> a[i]; 44 dfs(1,-1); 45 46 cout << up[1]+down[1] << endl; 47 48 return 0; 49 }
Codeforces Round #168 (Div. 1) B. Zero Tree 树形dp
标签:frame define 一点 using under href 思路 操作 nbsp
原文地址:http://www.cnblogs.com/yxg123123/p/6941193.html