1. 程式人生 > >bzoj 1131 簡單樹形dp

bzoj 1131 簡單樹形dp

struct AI In add DG 一個 思路 urn print

思路:隨便想想就能想出來啦把。。。 卡了我一個vector。。。

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int,int>
#define piii pair<int, pair<int,int> >

using namespace std;

const int N = 1e6 + 10;
const int M = 10 + 7
; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1e9 + 7; const double eps = 1e-6; int n, tot, head[N]; LL cnt[N], sum[N], dp[N]; struct Edge { int to, nx; } edge[N << 1]; void add(int u, int v) { edge[tot].to = v; edge[tot].nx = head[u]; head[u]
= tot++; } void dfs1(int u, int p) { cnt[u] = 1; for(int i = head[u]; ~i; i = edge[i].nx) { int v = edge[i].to; if(v == p) continue; dfs1(v, u); cnt[u] += cnt[v]; sum[u] += sum[v] + cnt[v]; } } void dfs2(int u, int p) { if(p) { dp[u]
= sum[u] + (dp[p] - (sum[u] + cnt[u]) + n - cnt[u]); } for(int i = head[u]; ~i; i = edge[i].nx) { int v = edge[i].to; if(v == p) continue; dfs2(v, u); } } int main() { memset(head, -1, sizeof(head)); scanf("%d", &n); for(int i = 1; i < n; i++) { int u, v; scanf("%d%d", &u, &v); add(u, v); add(v, u); } dfs1(1, 0); dp[1] = sum[1]; dfs2(1, 0); int ans = 1; for(int i = 1; i <= n; i++) { if(dp[ans] < dp[i]) { ans = i; } } printf("%d\n", ans); return 0; } /* */

bzoj 1131 簡單樹形dp