POJ 1463 Strategic game(树形DP-树上的点集覆盖模型)

题意:一城堡的所有的道路形成一个n个节点的树,如果在一个节点上放上一个士兵,那么和这个节点相连的边就会被看守住,

问把所有边看守住最少需要放多少士兵。

思路:和最大独立集的思路差不多,转移方程差不多,用0,1表示子树的根放不放士兵

dp[root][0] += dp[son][1];

dp[root][1] += min(dp[son][1],dp[son][0]);

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;

const int N = 1500+100;

int n;
char op[25];
int dp[N][2];
struct node
{
    int to;
    int next;
}es[N<<1];
int head[N];
void dfs(int u,int pa)
{
    dp[u][1]=1;
    for(int i=head[u];~i;i=es[i].next)
    {
        int v=es[i].to;
        if(v==pa) continue;
        dfs(v,u);
        dp[u][0]+=dp[v][1];
        dp[u][1]+=min(dp[v][1],dp[v][0]);
    }
}
int main()
{
    while(~scanf("%d",&n))
    {
        int root=-1;
        int top=0;
        memset(dp,0,sizeof(dp));
        memset(head,-1,sizeof(head));
        for(int i=1;i<=n;i++)
        {
            int s=0,m;
            scanf("%d:(%d)",&s,&m);
            if(root==-1) root=s;
            for(int i=1;i<=m;i++)
            {
                int v;
                scanf("%d",&v);
                es[top].to=v;
                es[top].next=head[s];
                head[s]=top++;
                es[top].to=s;
                es[top].next=head[v];
                head[v]=top++;
            }
        }
        dfs(root,-1);
        printf("%d\n",min(dp[root][1],dp[root][0]));
    }
    return 0;
}
时间: 2024-10-15 14:16:59

POJ 1463 Strategic game(树形DP-树上的点集覆盖模型)的相关文章

POJ 1463 Strategic game( 树形DP )

题意:一颗 N 个节点的树,在某一个节点上放置一个兵则可以守住与它相邻的边.最少放置多少个兵才可以守住所有的边. #include <cstdio> #include <deque> using namespace std; #define ABANDON 0 #define GET 1 deque< int > graph[2010]; int DP[2010][2]; void DFS( int start, int parent ){ DP[start][ABAN

POJ 1463 Strategic game 最小点覆盖集(树形dp)

点击打开链接 Strategic game Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 6105   Accepted: 2808 Description Bob enjoys playing computer games, especially strategic games, but sometimes he cannot find the solution fast enough and then he is v

poj 2324 Anniversary party(树形DP)

/*poj 2324 Anniversary party(树形DP) ---用dp[i][1]表示以i为根的子树节点i要去的最大欢乐值,用dp[i][0]表示以i为根节点的子树i不去时的最大欢乐值, ---于是当i去时,i的所有儿子都不能去:dp[i][1]=sum(dp[j][0])+a[i],其中j是i的儿子节点. ---当i不去时,i的儿子可去也可不去:dp[i][0]=sum(max(dp[j][0],dp[j][1])),j是i的儿子节点 ---边界条件:当i时叶子节点时,dp[i][

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

poj 1463 Strategic game DP

题目地址:http://poj.org/problem?id=1463 题目: Strategic game Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 7929   Accepted: 3692 Description Bob enjoys playing computer games, especially strategic games, but sometimes he cannot find the solu

[POJ 1947]Rebuilding Roads (树形dp)

题目链接:http://poj.org/problem?id=1947 题目大意:给你一棵树,树上N个节点.问最少拆掉多少条边使得存在一个联通块,有P个节点. 树形dp,设计状态:dp[u][i]代表以u为根节点的剩下i个节点最少需要拆掉多少条边. 状态转移:dp[u][i+j] = min(dp[u][i+j],dp[u][i]+dp[v][j]-1); 其中v是u的儿子节点. 相当于在树上跑01背包,即每个儿子节点去掉剩下j个的但是要连上u-v边,或者不去掉剩下j个的. 代码: 1 impo

POJ 1947 Rebuilding Roads (树形dp 经典题)

Rebuilding Roads Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 9499   Accepted: 4317 Description The cows have reconstructed Farmer John's farm, with its N barns (1 <= N <= 150, number 1..N) after the terrible earthquake last May. The

POJ - 3162 Walking Race 树形dp 单调队列

POJ - 3162Walking Race 题目大意:有n个训练点,第i天就选择第i个训练点为起点跑到最远距离的点,然后连续的几天里如果最远距离的最大值和最小值的差距不超过m就可以作为观测区间,问这样的区间最长的长度? 一开始楞是没看懂题意,最讨厌这种四级题,这是在刁难我英语小能手(能用翻译的就不自己动手).而且这题感觉单调队列那里的处理更难一点,不过还是来说一说怎么树形dp取得最远距离,先画个简简单单丑丑的图 我们直接从1作为根节点开始dfs的话,可以处理1的最远距离,并且可以得出到其它节点

POJ 3162 Walking Race 树形DP+线段树

给出一棵树,编号为1~n,给出数m 漂亮mm连续n天锻炼身体,每天会以节点i为起点,走到离i最远距离的节点 走了n天之后,mm想到知道自己这n天的锻炼效果 于是mm把这n天每一天走的距离记录在一起,成为一段长度为n的数列 现在mm想要从这数列中选出一个连续的区间,要求这个区间的max-min<=m 输出最长的区间 做了一个下午 思路: 分成2个部分: 1.求出数列,即对于一棵树,求出每一个节点能到达的最远距离 2.对于这段数列,选出一个区间,使得区间的max-min<=m,并且使得区间长度尽量