第一个自己做出来的树形DP,nice.
#include<iostream>
#include<vector>
using namespace std;
int a[10010];
int n;
struct point
{
int son;
int father;
int brother;
int put;
int not_put;
}p[10010];
void init()
{
int i;
for(i=0;i<n;i++)
{
p[i].father = -1;
p[i].brother = -1;
p[i].son = -1;
p[i].put = p[i].not_put= 0;
}
return ;
}
void dfs(int x)
{
int son = p[x].son;
p[x].put = 1;
while(son!=-1)
{
dfs(son);
p[x].put += min(p[son].put,p[son].not_put);//如果放士兵,儿子节点就有放和不放
p[x].not_put += p[son].put; //父节点不放,儿子节点必须放
son = p[son].brother;
}
return ;
}
int main()
{
int x,y;
std::ios::sync_with_stdio(false);
int m;
while(cin>>n)
{
init();
int i,j;
char ch;
for(i=0;i<n;i++)
{
cin>>x>>ch>>ch>>m>>ch;
for(j=0;j<m;j++)
{
cin>>y;
p[y].father = x;
p[y].brother = p[x].son;
p[x].son = y;
}
}
if(n==1)
{
cout<<1<<endl;
continue;
}
for(i=0;i<n;i++)
{
if(p[i].father==-1)
{
dfs(i);
break;
}
}
cout<<min(p[i].put,p[i].not_put)<<endl;
}
return 0;
}