题目描述
给你一棵树,问你选择最少的点覆盖所有的边
题解:
这个题我一上来直接一发贪心wa掉,后来自我否定了一波
拿这个歪歪扭扭 的菊花图来讲,如果按照贪心的思路,每次选连接度数最多的那个点,那么红色标记的点为选出来的点,但是 其实只需要选出紫色标记就能满足条件,所以说贪心并不是正解
那就考虑dp,因为这是jjl大佬的题单,盲猜一波树上dp
和之前写的那篇没有上司的舞会的模型基本一样
Code
int n,d[maxn],dp[maxn][2],root;
vector<int>e[maxn];
void dfs(int u) {
for(int v:e[u]) {
dfs(v);
dp[u][0]+=dp[v][1];
dp[u][1]+=min(dp[v][0],dp[v][1]);
}
}
int main() {
n=read();
rep(i,1,n) dp[i][1]=1;
for(int i=1 ; i<=n ; i++) {
int x=read();
x++;
int y=read();
for(int j=1 ; j<=y; j++) {
int v=read();
v++;
e[x].push_back(v);
d[v]++;
}
}
rep(i,1,n) if(d[i]==0) root=i;
dfs(root);
out(min(dp[root][1],dp[root][0]));
return 0;
}