zoukankan      html  css  js  c++  java
  • 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
    ",min(dp[root][0],dp[root][1]));
        }
        return 0;
    }
    
    
  • 相关阅读:
    正则表达式学习
    《代码整洁之道》阅读笔记
    PHP手册阅读笔记(一)——XXX
    2014年终总结和2015年规划
    linux之帮助命令——help,man,whereis简介
    企业中git管理代码的基本流程
    推荐几款画韦恩图的在线工具
    HTTPContent-Type的含义
    s s
    asp.net core ServiceProvider
  • 原文地址:https://www.cnblogs.com/d-e-v-i-l/p/5312639.html
Copyright © 2011-2022 走看看