poj 1463 Strategic game (树形DP)

原创 2016年08月29日 22:00:36


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.

For example for the tree: 

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

Input

The input 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_identifiernumber_of_roads
    or 
    node_identifier:(0) 

The node identifiers are integer numbers between 0 and n-1, for n nodes (0 < n <= 1500);the number_of_roads in each line of input will no more than 10. Every edge appears only once in the input data.

Output

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:

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
 
<span style="color:#ff6666;">题意:给出一棵树,要求找到最少放几个士兵才能将所有点都看守到,每个节点的士兵只能看守临近一个的节点</span>

思路:标准的树形DP,建树的时候要双向都建

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{
   int now,next;
}str[3005];
int dp[1505][2],vis[1505],head[1505];
int root,len;
void add(int x,int y)
{
    str[len].now=y;
    str[len].next=head[x];
    head[x]=len++;
    str[len].now=x;
    str[len].next=head[y];
    head[y]=len++;
}
void dfs(int rt)
{
    vis[rt]=1;
    dp[rt][1]=1;
    dp[rt][0]=0;
    for(int i=head[rt];i!=-1;i=str[i].next)
    {
        int k=str[i].now;
        if(!vis[k])
        {
            dfs(k);
            dp[rt][0]+=dp[k][1];
            dp[rt][1]+=min(dp[k][1],dp[k][0]);
        }
    }
}
int main()
{
    int t;
    while(~scanf("%d",&t))
    {
        memset(dp,0,sizeof(dp));
        memset(vis,0,sizeof(vis));
        memset(head,-1,sizeof(head));
        root=-1;
        len=0;
        for(int i=1;i<=t;i++)
        {
            int x,n;
            scanf("%d:(%d)",&x,&n);
            if(root==-1)
               root=x;
            for(int j=1;j<=n;j++)
            {
                int y;
                scanf("%d",&y);
                add(x,y);
            }
        }
        dfs(root);
        printf("%d\n",min(dp[root][0],dp[root][1]));
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

POJ 1463 Strategic game (树形dp 树的最小覆盖 水)

ZOJ1134 POJ1463 HDU1054 Strategic Game, 树形DP

经典的树形DP吧, 每个点有取和不取两种状态, 如果这个点不取, 则子节点必取, 否则子节点可取可不取. /*****************************************...

【POJ 1463】【hdu 1054】Strategic game(树形dp)

尘埃落定、洗尽铅华,转身一世琉璃白

POJ1463 Strategic game(树形DP)

Strategic game Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 6722 ...

poj 1463 Strategic game(树形dp,最小边覆盖集)

Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 7501   Accepted: 3489 Description...

HDU1054 && POJ1463:Strategic game(树形DP)

Description Bob enjoys playing computer games, especially strategic games, but sometimes he cannot f...

POJ1463Strategic game[树形DP]

题目大意是: 有一颗树,n个节点,问,最少用几个点,让所有的点与它们中任意一个相邻#include #include #include #include #include #include...

POJ 1463 Strategic game (树形DP) 解题报告

题意简述          有若干结点,结点之间有路相连,构成树形结构,如果在一个结点上放置一个士兵,与这个结点相连的路就可以被监视,现在要监视所有的路,问至少要多少士兵。 思路:   ...

【树形动态规划】poj1463 strategic game

说白了,和一般的动态规划也没啥区别,只不过是状态的转移跑到了树的子父节点之间。 这道题目应该还算是简单的,由于是第一次做,还是花费了很大的时间啊…… 主要就是邻接表表示图(发现vector真的很好...

背包(4)Hdu 1520 Anniversary party(树形背包)+ Poj 1463 Strategic game(还可以贪心来做)

Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)