树形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 }
View Code

 

posted @ 2015-08-30 13:11  相儒以沫  阅读(108)  评论(0编辑  收藏  举报