萌新刚学树形dp,这题不会

P3155 [CQOI2009] 叶子的染色

@[一之濑琴美](/space/show?uid=72408) ```cpp #include <vector> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; inline void Read(int &x) { x = 0; char a = getchar(); bool f = 0; while(a < '0'||a > '9') {if(a == '-') f = 1;a = getchar();} while(a >= '0'&&a <= '9') {x = x * 10 + a - '0';a = getchar();} if(f) x *= -1; } const int MAXN = 10001; int m,c[MAXN],dp[MAXN][3]; vector<int> G[MAXN]; bool vis[MAXN]; //1 - 1,0 - 0 template<typename T> inline T Min(T a,T b,T c) {return min(a,min(b,c));} inline void dfs(int x) { int i; if(x <= m) { if(c[x] == 1) dp[x][1] = 1,dp[x][0] = 0x7f7f; else dp[x][0] = 1,dp[x][1] = 0x7f7f; dp[x][2] = 0x7f7f; } for(i = 0;i < G[x].size();i++) { int v = G[x][i]; if(!vis[v]) { vis[v] = 1; dfs(v); dp[x][1] += Min(dp[v][1] - 1 >=0 ? dp[v][1] - 1:0x7f7f,dp[v][0],dp[v][2]); dp[x][0] += Min(dp[v][1],dp[v][0] - 1 >= 0 ? dp[v][0] - 1:0x7f7f,dp[v][2]); dp[x][2] += Min(dp[v][1],dp[v][0],dp[v][2]); } } if(x > m) dp[x][1]++,dp[x][0]++; } int main() { int n,i; Read(n),Read(m); for(i = 1;i <= m;i++) Read(c[i]); for(i = 1;i < n;i++) { int u,v; Read(u),Read(v); G[u].push_back(v); G[v].push_back(u); } for(i = m + 1;i <= n;i++) if(G[i].size() > 1) break; vis[i] = 1; dfs(i); printf("%d",Min(dp[i][2],dp[i][1],dp[i][0])); return 0; } ```
by resftlmuttmotw @ 2019-03-17 09:51:18


@[resftlmuttmotw](/space/show?uid=73992) emmm我看看
by 萌田薰子 @ 2019-03-17 09:51:52


思路很不一样啊=-=我是贪心直接搜的
by 萌田薰子 @ 2019-03-17 09:53:08


@[一之濑琴美](/space/show?uid=72408) 以前做的 现在连思路都想不起了 ~~(感觉自己好水)~~
by resftlmuttmotw @ 2019-03-17 09:54:59


@[resftlmuttmotw](/space/show?uid=73992) qaq你需要来点confidence嘛
by 萌田薰子 @ 2019-03-17 09:56:39


~~去你的萌新~~
by Smile_Cindy @ 2019-03-17 10:08:04


|