PKU 1463
2013-11-17 21:51
169 查看
题意:给出一棵树,在某个节点上放置一个卫兵可以管辖周围所有与该节点相连的边,
问最少需要放置多少个卫兵,能管辖所有的边。
问最少需要放置多少个卫兵,能管辖所有的边。
#include<iostream> #include<string.h> #include<stdio.h> #include<algorithm> #include<vector> #define maxn 100000 using namespace std; int dp[maxn][2]; int n; int root; vector<int>node[maxn]; void init() { int u,v,num; root=-1; for(int i=0;i<=n;i++) node[i].clear(); for(int i=0;i<n;i++) { scanf("%d:(%d)",&u,&num);//读入要注意 if(root==-1)root=u;//第一个点是根 while(num--) { cin>>v; node[u].push_back(v);//连有向边 } } } int solve(int fa) { dp[fa][0]=0;dp[fa][1]=1; for(int i=0;i<node[fa].size();i++) { int son=node[fa][i]; solve(son); //其实觉得类似于后续遍历,因为父亲要用到儿子的信息, //所以要先知道儿子的 dp[fa][0]+=dp[son][1];//如果该父亲不放,那么儿子必须放 dp[fa][1]+=min(dp[son][0],dp[son][1]); //如果该父亲放,儿子在放和不放之间选择最小的 } return min(dp[fa][0],dp[fa][1]); } int main() { while(cin>>n) { init(); printf("%d\n",solve(root));// } return 0; }
相关文章推荐
- pku 1463 Strategic game(树dp)
- pku 1463 Strategic game 树形DP
- pku1463 Strategic game
- pku 1915
- pku 2513 Colored Sticks Trie树+并查集+欧拉回路(半欧拉回路)
- pku 1177 pictures (线段树+扫描线+离散化)
- acm--pku--1163
- PKU--3749 破译密码
- pku-1664 放苹果(递推)
- PKU 3129
- pku 1611 The Suspects
- PKU 3675 Telescope
- 牛是否可以都到达某点——pku3256 Cow Picnic
- PKU 2429 GCD & LCM Inverse
- PKU 1161、PKU 2524、 PKU 1308
- pku 3074 3076 Sudoku 问题
- POJ1463 - 树型DP
- pku 3084 Panic Room
- PKU3630---tire
- pku acm 1028