牛客-战略游戏(树上dp)

题目描述

给你一棵树,问你选择最少的点覆盖所有的边

题解:

这个题我一上来直接一发贪心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;
}

猜你喜欢

转载自blog.csdn.net/wmy0536/article/details/109633526