hdu 1054 Strategic Game(树形DP)
2014-10-24 21:18
260 查看
//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 ; 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 ; 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; }
相关文章推荐
- HDU-1054 Strategic Game(树形DP)
- HDU1054 && POJ1463:Strategic game(树形DP)
- HDU 1054 Strategic Game(树形DP)
- HDU - 1054 Strategic Game(二分图最小点覆盖/树形dp)
- hdu - 1054 - Strategic Game(树形dp)
- HDU-1054 Strategic Game(树形DP)
- HDU 1054 Strategic Game (树形DP)
- HDU 1054 Strategic Game (树形dp)
- HDU 1054 Strategic Game (树形DP)
- HDU 1054 Strategic Game(二分图最小点覆盖 或者 树形DP)
- hdu1054 Strategic Game(最小覆盖点-树形dp)
- HDU 1054 Strategic Game (树形DP/匹配)
- hdu 1054 &&poj 1463 Strategic Game(树形dp)
- hdu 1054 Strategic Game 树形dp
- HDU 1054 Strategic Game(树形DP)
- [HDU] 1054 Strategic Game 入门树形DP
- POJ 1463 && HDU 1054 Strategic Game (树形DP)
- HDU 1054 Strategic Game(树形DP)
- HDU 1054 Strategic Game (树形DP)
- HDU 1054 Strategic Game(树形DP)