最小支配集,题目不难,就是它给出数据的方式有点CD。
1 #include <stdio.h> 2 #include <string.h> 3 #define N 1505 4 int to[N][12]; 5 int all[N],dp[N]; 6 bool root[N]; 7 int min(int a,int b) 8 { 9 return a<b ?a :b; 10 } 11 void dfs(int u) 12 { 13 int v,i,cnt=0; 14 dp[u] = 1; 15 all[u] = 0; 16 for(i = 1; i <= to[u][0]; i++) 17 { 18 v = to[u][i]; 19 dfs(v); 20 dp[u] += all[v]; 21 cnt += dp[v]; 22 } 23 all[u] = min(dp[u],cnt); 24 } 25 int main() 26 { 27 int n,a,b,i,t; 28 while(~scanf("%d",&n)) 29 { 30 memset(root,1,N); 31 while(n--) 32 { 33 scanf("%d:(%d)",&a,&b); 34 to[a][0] = b; 35 for(i = 1; i <= b; i++) 36 { 37 scanf("%d",&t); 38 to[a][i] = t; 39 root[t] = 0; 40 } 41 } 42 for(i = 0; !root[i]; i++); 43 dfs(i); 44 printf("%d\n",all[i]); 45 } 46 return 0; 47 }