hdu 1054 Strategic Game(树形DP)

来源:互联网 发布:qt creator windows 编辑:程序博客网 时间:2024/04/30 14:03
//hdu 1054 Strategic Game(树形DP)/*题意:Bob喜欢玩电脑游戏,尤其是战略游戏,但有时他找不到解决方案不够快,然后他很伤心。现在他有以下问题。他必须捍卫一个中世纪的城市,道路的形成一个树。他已经把节点的最小数量的士兵,这样他们可以观察到所有的边缘。你能帮助他吗?题解:树形DP算法,在网上看过有人用二分图;不过我翻一下记录,用树形dp的时间125ms就够了*/#include<iostream>#include<cstdio>#include<cstring>#include<vector>using namespace std;const int N=1600;struct node{    int child,brother;    int ys,no;    node()    {        ys=1;        no=0;        child=brother=0;    }}tree[N];int n;int Min(int a,int b){    return a<b?a:b;}void dfs(int root){    int child=tree[root].child;    while(child!=0)    {        dfs(child);        tree[root].ys+=Min(tree[child].ys,tree[child].no);        tree[root].no+=tree[child].ys;        child=tree[child].brother;    }}bool flag[N];int main(){    node tem;    int from,vm,to,Root;    while(scanf("%d",&n)!=EOF)    {        memset(flag,false,sizeof(flag));       for(int i=0;i<n;i++)       {            scanf("%d:(%d)",&from,&vm);from++;            if(i==0) Root=from;            if(flag[from]==false)            {                tree[from]=tem;                flag[from]=true;            }            for(int j=0;j<vm;j++)            {                scanf("%d",&to);to++;                if(flag[to]==false)                {                    tree[to]=tem;                    flag[to]=true;                }                tree[to].brother=tree[from].child;                tree[from].child=to;            }       }       dfs(Root);       printf("%d\n",Min(tree[Root].ys,tree[Root].no));    }    return 0;}

0 0