题目大意:https://www.cnblogs.com/xxzh/p/9278487.html
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100000 + 10;
const int inf = 1e9 + 7;
int m, n, k = 1;
int head[maxn], c[maxn], dp[maxn][2];
struct EDGE {
int to, next;
} e[maxn];
void add(int u, int v) {
e[++k].next = head[u];
e[k].to = v;
head[u] = k;
}
void dfs(int x, int fa) {
if (x <= n) {
dp[x][c[x]] = 1;
dp[x][c[x] ^ 1] = inf;
return;
}
dp[x][1] = dp[x][0] = 1;
for (int i = head[x]; i; i = e[i].next) {
if (e[i].to == fa)
continue;
dfs(e[i].to, x);
dp[x][1] += min(dp[e[i].to][1] - 1, dp[e[i].to][0]);
dp[x][0] += min(dp[e[i].to][1], dp[e[i].to][0] - 1);
}
}
int main() {
int ans;
scanf("%d%d", &m, &n);
for (int i = 1; i <= n; i++) scanf("%d", &c[i]);
for (int i = 1; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
}
dfs(n + 1, 0);
ans = min(dp[n + 1][0], dp[n + 1][1]);
printf("%d\n", ans);
}
京公网安备 11010502036488号