poj1463--hdu1054--Strategic Game(树形DP练习4)

Strategic Game

Time Limit:10000MS     Memory Limit:32768KB     64bit IO Format:%I64d
& %I64u

Submit Status

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 form
a tree. He has to put the minimum number of soldiers on the nodes so that they can observe all the edges. Can you help him?

Your program should find the minimum number of soldiers that Bob has to put for a given tree.

The input file contains several data sets in text format. Each data set represents a tree with the following description:

the number of nodes

the description of each node in the following format

node_identifier:(number_of_roads) node_identifier1 node_identifier2 ... node_identifier

or

node_identifier:(0)

The node identifiers are integer numbers between 0 and n-1, for n nodes (0 < n <= 1500). Every edge appears only once in the input data.

For example for the tree:

the solution is one soldier ( at the node 1).

The output should be printed on the standard output. For each given input data set, print one integer number in a single line that gives the result (the minimum number of soldiers). An example is given in the following table:

Sample Input

 4
0:(1) 1
1:(2) 2 3
2:(0)
3:(0)
5
3:(3) 1 4 2
1:(1) 0
2:(0)
0:(0)
4:(0)
        

Sample Output

 1
2 

给出有向图,要求找出用最少的人数可以看守所有的边。

dp[i][0] 以i为根的子树,i上不放人时,需要的最少人数。

dp[i][1] 以i为根的子树,i上放人时,需要的最少人数。

状态转移方程:j为i的子节点

dp[i][0] += dp[j][1] ;

dp[i][1] += max( dp[j][0],dp[j][1] ) ;

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
struct node{
    int u , v ;
    int next ;
}edge[2000];
int head[2000] , cnt ;
int dp[2000][2] ;
void add(int u,int v)
{
    edge[cnt].u = u ; edge[cnt].v = v;
    edge[cnt].next = head[u] ;
    head[u] = cnt++ ;
    return ;
}
void dfs(int u)
{
    int i , v ;
    dp[u][0] = 0 ;
    dp[u][1] = 1 ;
    for(i = head[u] ; i != -1 ; i = edge[i].next)
    {
        v = edge[i].v ;
        dfs(v) ;
        dp[u][0] += dp[v][1] ;
        dp[u][1] += min(dp[v][0],dp[v][1]) ;
    }
    return ;
}
int main()
{
    int n , m , i , j , u , v , rt ;
    while( scanf("%d", &n) != EOF )
    {
        cnt = 0 ;
        rt = (n-1)*(n)/2 ;
        memset(head,-1,sizeof(head)) ;
        memset(dp,0,sizeof(dp)) ;
        for(i = 0 ; i < n ; i++)
        {
            scanf("%d:(%d)", &u, &m) ;
            while( m-- )
            {
                scanf("%d", &v) ;
                add(u,v) ;
                rt -= v ;
            }
        }
        dfs(rt) ;
        printf("%d\n", min(dp[rt][0],dp[rt][1])) ;
    }
    return 0;
}
时间: 2024-08-28 15:30:38

poj1463--hdu1054--Strategic Game(树形DP练习4)的相关文章

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 )

题意:一颗 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

HDU 1054 Strategic Game (树形dp)

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

hdu1054 Strategic Game(最小覆盖点-树形dp)

题目链接:点击打开链接 题意描述:给一棵树,找最少的点集能把树上的所有边覆盖掉? 解题思路:典型的最小覆盖点 树形dp即可 dp[i][0]:表示如果不选i点则dp[i][0]+=dp[t][1];///表示要选所有的儿子节点 dp[i][1]:表示如果选i点则dp[i][1]+=min(dp[t][0],dp[t][1]);///表示选择其儿子节点中较小的情况 代码: #pragma comment(linker,"/STACK:1024000000,1024000000") #in

hdu1054 树形dp

http://acm.hdu.edu.cn/showproblem.php?pid=1054 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

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

Strategic game(POJ 1463 树形DP)

Strategic game Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 7490   Accepted: 3483 Description Bob enjoys playing computer games, especially strategic games, but sometimes he cannot find the solution fast enough and then he is very sad

UVa 2038 - Strategic game(二分图最小顶点覆盖 or 树形DP)

Strategic game 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 wh

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

树形dp compare E - Cell Phone Network POJ - 3659 B - Strategic game POJ - 1463

B - Strategic game POJ - 1463 题目大意:给你一棵树,让你放最少的东西来覆盖所有的边 这个题目之前写过,就是一个简单的树形dp的板题,因为这个每一个节点都需要挺好处理的. 这个树形dp是从底往根部来递推,所以每一个点,都是由它的根节点来递推的. 如果一个根节点的子节点放了东西,那么这个根节点就可以有选择,但是如果没有放东西,那么这个根节点就必须放东西. E - Cell Phone Network POJ - 3659 题目大意:给你一棵树,让你用最小的东西来覆盖所有