1. 程式人生 > >【Luogu2996】拜訪奶牛

【Luogu2996】拜訪奶牛

turn line http [0 can const pro clu inline

點此進入原題

算法樹形DP

題解

一道樹形dp。由題意可知,這題是樹形結構題。我們設f[i][0],表示不訪問i號節點,f[i][1]表示訪問i號節點。因為訪問了i號節點,則不能訪問i的孩子節點,所以可以得出下面的式子:

f[i][0] += max{f[k][0], f[k][1]}

f[i][1] += f[k][0] + 1

(f[i][0]=0, f[i][1]=1, k是i的孩子)

可以用鄰接表存儲。同時要註意孩子不能返回訪問父親。

代碼

#include <cstdio>
const int N = 50005;
int head[N], next[2*N], adj[2*N], tot, n, f[N][2
]; inline int mx(int x, int y) { return x > y ? x : y; } void addedge (int u, int v) { next[++tot] = head[u]; head[u] = tot; adj[tot] = v; } void dfs(int u, int father) { f[u][1] = 1; for(int e = head[u]; e; e = next[e]) { if(adj[e] == father) continue; dfs(adj[e], u); f[u][
0] += mx(f[adj[e]][0], f[adj[e]][1]); f[u][1] += f[adj[e]][0]; } } int main() { scanf("%d", &n); for(int i = 1, u, v; i < n; i++) { scanf("%d%d", &u, &v); addedge(u, v); addedge(v, u); } dfs(1, 0); printf("%d", mx(f[1][0], f[1][1]));
return 0; }

【Luogu2996】拜訪奶牛