@[一之濑琴美](/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