hdu - 1054 - Strategic Game(树形dp)

题意:一棵n个结点的无根树(0 < n <= 1500),在一个结点放一个士兵,可以守护与这个点相邻的所有边,问最少需要多少个士兵,可以守护所有边。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054

——>>状态:

dp[i][1]表示以 i 为结点的子树,在 i 放一个士兵,可以守护所有边的最少士兵数。

dp[i][0]表示以 i 为结点的子树,在 i 不放士兵,可以守护所有边的最少士兵数。

状态转移方程(结点 j 是结点 i 的儿子):

dp[i][1] += min(dp[j][1], dp[j][0]);(如果结点 i 放了士兵,那么 i 连向其儿子的边已被守护,所以其儿子可放可不放士兵)

dp[i][0] += dp[j][1];(如果结点 i 不放士兵,那么 i 连向其儿子的边必须由其儿子守护)

对于叶子结点i:

dp[i][1] = 1;(虽然以叶子为根的子树无边,但因放了一个士兵在根,所以是1)

dp[i][0] = 0;

#include <cstdio>
#include <cstring>
#include <algorithm>

using std::min;

const int MAXN = 1500 + 10;

struct EDGE
{
    int nTo;
    int nNext;
};

int nHead[MAXN];
int nEdge;
int dp[MAXN][2];
EDGE edge[MAXN << 1];

void Init()
{
    nEdge = 0;
    memset(nHead, -1, sizeof(nHead));
}

void AddEdge(int nFrom, int nTo)
{
    edge[nEdge].nTo = nTo;
    edge[nEdge].nNext = nHead[nFrom];
    nHead[nFrom] = nEdge++;
}

void Read(int n)
{
    int nFrom;
    int nCnt;
    int nTo;

    for (int i = 0; i < n; ++i)
    {
        scanf("%d:(%d)", &nFrom, &nCnt);
        for (int j = 0; j < nCnt; ++j)
        {
            scanf("%d", &nTo);
            AddEdge(nFrom, nTo);
            AddEdge(nTo, nFrom);
        }
    }
}

void Dfs(int i, int nFather)
{
    dp[i][1] = 1;
    dp[i][0] = 0;

    if (nHead[i] == -1) return;

    for (int e = nHead[i]; e != -1; e = edge[e].nNext)
    {
        int j = edge[e].nTo;
        if (j != nFather)
        {
            Dfs(j, i);
            dp[i][1] += min(dp[j][1], dp[j][0]);
            dp[i][0] += dp[j][1];
        }
    }
}

void Output()
{
    printf("%d\n", min(dp[0][1], dp[0][0]));
}

int main()
{
    int n;

    while (scanf("%d", &n) == 1)
    {
        Init();
        Read(n);
        Dfs(0, -1);
        Output();
    }

    return 0;
}
时间: 2024-12-26 00:38:43

hdu - 1054 - Strategic Game(树形dp)的相关文章

HDU 1054 Strategic Game (树形dp)

题目链接 题意: 给一颗树,用最少的点覆盖整棵树. 分析: 1:以当前节点为根节点,在该节点排士兵守护道路的最小消耗.在这种情况下,他的子节点可以安排士兵,也可以不安排士兵.可以从各个子节点两个不同状态(存在士兵,不存在士兵)的最值中选出最小的消耗,然后相加就求出了当前节点派士兵的最小消耗. 2:以当前节点为根节点,不存在士兵.这种情况十分清楚,因为当前节点没有士兵,那么这个节点到子节点之间的道路没有人守护,那么子节点就必须要安排士兵,因此这种情况下.这个节点的最小消耗就是每个子节点存在士兵的情

hdu 1054 Strategic Game (二分匹配)

Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4697    Accepted Submission(s): 2125 Problem Description Bob enjoys playing computer games, especially strategic games, but somet

HDU 1011 Starship Troopers(树形DP)

Starship Troopers Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 62   Accepted Submission(s) : 12 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description You, the leader of

hdu 1520Anniversary party(简单树形dp)

Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4310    Accepted Submission(s): 1976 Problem Description There is going to be a party to celebrate the 80-th Anniversary of the

hdu 1054 Strategic Game (最小顶点覆盖+稀疏图)

Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4889    Accepted Submission(s): 2225 Problem Description Bob enjoys playing computer games, especially strategic games, but some

hdu 4044 GeoDefense (树形dp+01背包)

GeoDefense Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 663    Accepted Submission(s): 267 Problem Description Tower defense is a kind of real-time strategy computer games. The goal of towe

HDU 2196 Computer 经典树形DP

一开始看错题了,后来发现原来是在一颗带权的树上面求出距离每一个点的最长距离,做两次dfs就好,具体的看注释? #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #incl

Strategic Game(树形DP)

目录 Strategic Game(树形DP) 题目 题意 思路 题解 Strategic Game(树形DP) 题目 Bob enjoys playing computer games, especially strategic games, but sometimes he cannot find the solution fast enough and then he is very sad. Now he has the following problem. He must defend

HDU 1054 Strategic Game(树形DP)

Problem Description Bob enjoys playing computer games, especially strategic games, but sometimes he cannot find the solution fast enough and then he is very sad. Now he has the following problem. He must defend a medieval city, the roads of which for

hdu 5452 Minimum Cut 树形dp

Minimum Cut Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5452 Description Given a simple unweighted graph G (an undirected graph containing no loops nor multiple edges) with n nodes and m edges. Let T be a spa