原题 树形DP #include <iostream> #include <algorithm> #define MAXN 1600 using namespace std ; struct Graph { int vex , next ; }; Graph G[MAXN] ; int first[MAXN] , dp[MAXN][2] ; void TreeDP (int s) { int tot ; dp[s][0] = 0 , dp[s][1] = 1 ; for (tot = first[s] ; tot != -1 ; tot = G[tot].next) { TreeDP (G[tot].vex) ; dp[s][0] += dp[G[tot].vex][1] ; dp[s][1] += min (dp[G[tot].vex][0] , dp[G[tot].vex][1]) ; } } int main () { int n ; while (scanf ("%d" , &n) != EOF) { bool IsRoot = true ; int i , j , m , tot , root , u , v ; memset (first , -1 , sizeof (first)) ; for (i = tot = 0 ; i < n ; i ++) { scanf ("%d:(%d)" , &u , &m) ; if (IsRoot) root = u , IsRoot = false ; for (j = 0 ; j < m ; j ++) { scanf ("%d" , &v) ; G[tot].vex = v ; G[tot].next = first[u] ; first[u] = tot ++ ; } } TreeDP (root) ; printf ("%d/n" , min (dp[root][0] , dp[root][1])) ; } return 0 ; } 贪心 #include <stdio.h> #include <string.h> #define MAX 1510 int n , par[MAX] , leaf[MAX] , cover[MAX] , place[MAX] , m , child[MAX] , back[MAX] , set[MAX] ; void Readin () { int i , j , c , k ; memset (par , -1 , sizeof (par)) ; memset (child , -1 , sizeof (child)) ; memset (place , -1 , sizeof (place)) ; memset (cover , -1 , sizeof (cover)) ; memset (leaf , -1 , sizeof (leaf)) ; memset (back , 0 , sizeof (back)) ; for (i = 0 ; i < n ; i ++) { scanf ("%d:(%d)" , &k , &m) ; child[k] = m ; for (j = 0 ; j < m ; j ++) { scanf ("%d" , &c) ; par[c] = k ; } } for (i = m = 0 ; i < n ; i ++) if (!child[i]) leaf[m ++] = i ; memcpy (set , child , sizeof (child)) ; } void Comp () { int i , j ; for (i = 0 ; i < m ; i ++) { j = leaf[i] ; if (par[j] == -1) break ; if (place[j] == 1) back[par[j]] ++ ; else if (cover[j] == -1) { if (back[j] == child[j]) { place[par[j]] = 1 ; } else { place[j] = 1 ; back[par[j]] ++ ; } cover[j] = 1 ; } set[par[j]] -- ; if (set[par[j]] == 0) leaf[m ++] = par[j] ; } } void Print () { int i , count ; for (i = count = 0 ; i < n ; i ++) if (place[i] == 1) count ++ ; printf ("%d/n" , count) ; } int main () { while (scanf ("%d" , &n) != EOF) { Readin () ; Comp () ; Print () ; } return 0 ; } 此题还有二分图匹配的算法