1 2 3 4

树的最大独立集合问题

利用树形DP可以有效解决该问题!

 

 

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#define maxn 2000
using namespace std;
vector<int>G[maxn];
void insert(int be, int en) {
	G[be].push_back(en);
}
int dp[maxn][3];
int dfs(int x,int fa) {
	for (int i = 0; i < G[x].size(); i++) {
		int p = G[x][i];
		if (p == fa) continue;
		dfs(p, x);
		dp[x][1] += min(dp[p][1], dp[p][0]);
		dp[x][0] += dp[p][1];
	}
	return 0;
}
int main() {
	int n;
	scanf("%d", &n);
	int be, k, en;
	for (int i = 0; i < n; i++) {
		scanf("%d %d", &be, &k);
		while (k--) {
			scanf("%d", &en);
			insert(be, en);
			insert(en, be);
		}
	}
	for (int i = 0; i < maxn; i++) {
		dp[i][1] = 1;
	}
	dfs(1, -1);
	printf("%d\n", n - max(dp[1][0], dp[1][1]));
	return 0;
}

  

posted @ 2019-10-09 19:20  Lesning  阅读(446)  评论(0编辑  收藏  举报