树形DP POJ1463
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace std; 6 7 int dp[1510][2]; 8 int head[1510]; 9 bool in[1510]; 10 int num; 11 12 struct edge 13 { 14 int fro,to,next; 15 }e[15010]; 16 17 void addEdge(int _fro,int _to) 18 { 19 e[num].fro=_fro; 20 e[num].to=_to; 21 e[num].next=head[_fro]; 22 head[_fro]=num; 23 num++; 24 } 25 26 int dfs(int x) 27 { 28 if(dp[x][0]!=-1&&dp[x][1]!=-1) 29 return min(dp[x][0],dp[x][1]); 30 dp[x][0]=0; 31 dp[x][1]=1; 32 for(int i=head[x];i!=-1;i=e[i].next) 33 { 34 int v=e[i].to; 35 dfs(v); 36 dp[e[i].fro][1]=min(dp[v][0],dp[v][1])+dp[e[i].fro][1]; 37 dp[e[i].fro][0]+=dp[v][1]; 38 } 39 return min(dp[x][0],dp[x][1]); 40 } 41 42 int main() 43 { 44 int n,m; 45 while(scanf("%d",&n)!=EOF) 46 { 47 int a,b; 48 num=0; 49 memset(dp,-1,sizeof(dp)); 50 memset(in,true,sizeof(in)); 51 memset(head,-1,sizeof(head)); 52 for(int i=0;i<n;i++) 53 { 54 scanf("%d:(%d)",&a,&m); 55 for(int t=0;t<m;t++) 56 { 57 scanf("%d",&b); 58 addEdge(a,b); 59 in[b]=false; 60 } 61 } 62 int ans; 63 for(int i=0;i<n;i++) 64 { 65 if(in[i]) 66 { 67 ans=dfs(i); 68 } 69 } 70 cout<<ans<<endl; 71 } 72 return 0; 73 }