利用树形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 - max(dp[1][0], dp[1][1])); return 0; }