POJ 1463 浅谈简单树形动态规划及树上最小点覆盖

POJ 1463 浅谈简单树形动态规划及树上最小点覆盖_第1张图片
世界真的很大
很多经典的图论问题放在树上就显得简单
二分图的最小点覆盖
这里就变成了一个简单的树形DP而已

看题先:

description:

鲍勃喜欢玩电脑游戏,特别是战略游戏,但有时候他无法快速找到解决方案,那么他很伤心。 现在他有以下问题。 他必须捍卫一座中世纪城市,其道路形成一棵树。 他必须将最少数量的士兵放在节点上,以便他们可以观察所有的边缘。 你可以帮助他吗?

您的程序应该找到Bob为给定树提供的最小兵数。

例如树:

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:

简单树形DP,大概是用来练手的吧
树形DP与子树有关,考虑一个点的状态只有选或者不选,所以设计状态01表示这个点选不选
考虑状态转移及子树状态合并,如果这个点选了那他的所有子树都是可选可不选,sigma min(f(v,0),f(v,1))
如果这个点不选,那么其所有子树都必须选,sigma f(v,1)
但是这道题的读入真的是恶心
不妨碍1A
233

完整代码:

#include
#include
#include
using namespace std;

struct edge
{
    int v,last;
}ed[100010];

int n,num=0;
int head[100010],f[100010][2];

void init()
{
    num=0;
    memset(head,0,sizeof(head));
    memset(f,0,sizeof(f));
}

void add(int u,int v)
{
    num++;
    ed[num].v=v;
    ed[num].last=head[u];
    head[u]=num;
}

void dfs(int u,int fa)
{
    f[u][1]=1;
    for(int i=head[u];i;i=ed[i].last)
    {
        int v=ed[i].v;
        if(v==fa) continue ;
        dfs(v,u);
        f[u][1]+=min(f[v][0],f[v][1]);
        f[u][0]+=f[v][1];
    }
}

int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        init();
        for(int i=1;i<=n;i++)
        {
            int u,w;
            scanf("%d:(%d)",&u,&w);
            while(w--)
            {
                int v;
                scanf("%d",&v);
                add(u,v),add(v,u);
            }
        }
        dfs(1,1);
        printf("%d\n",min(f[1][0],f[1][1]));
    }
    return 0;
} 
/* Whoso pulleth out this sword from this stone and anvil is duly born King of all England */

嗯,就是这样

你可能感兴趣的:(DP,树形DP)