HDU1054 Strategic Game(树形dp)
题意:给出一棵树,要求找到最少放几个士兵才能将所有点都看守到,每个节点的士兵只能看守临近一个的节点
思路:
简单的树形dp,往下扫一次就好了
二分图也可做,应该不如树形dp快
/* *********************************************** Author :devil Created Time :2016/3/21 14:13:19 ************************************************ */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <cmath> #include <stdlib.h> using namespace std; #define N 1510 int n,dp[N][2]; bool vis[N]; vector<int>eg[N]; void init() { for(int i=0;i<=n;i++) { eg[i].clear(); dp[i][0]=0; dp[i][1]=1; vis[i]=false; } } void dfs(int u) { vis[u]=true; for(int i=0;i<eg[u].size();i++) { int to=eg[u][i]; if(!vis[to]) dfs(to); dp[u][1]+=min(dp[to][1],dp[to][0]); dp[u][0]+=dp[to][1]; } } int main() { //freopen("in.txt","r",stdin); int x,m,y,root; while(~scanf("%d",&n)) { init(); for(int i=0;i<n;i++) { scanf("%d:(%d)",&x,&m); if(i==0) root=x; for(int j=0;j<m;j++) { scanf("%d",&y); eg[x].push_back(y); } } dfs(root); printf("%d\n",min(dp[root][0],dp[root][1])); } return 0; }