LA 2038 最少点覆盖

题目链接:https://vjudge.net/problem/UVALive-2038

题意:我看了原题,lrj的书上题意写错了,应该是最少点覆盖,当然可以用最大匹配去做,由于是树形的;

可以树形DP;

d[u][0] : u 结点 不放;

d[u][1] : u 结点放;

 1 #include <bits/stdc++.h>
 2
 3 using namespace std;
 4
 5 const int maxn = 1500 + 5;
 6 int n;
 7 vector<int> G[maxn];
 8
 9 int d[maxn][2];
10 int p[maxn];
11
12 int dfs(int u,int fa) {
13     int d = G[u].size();
14     for(int i=0;i<d;i++)
15     {
16         int v = G[u][i];
17         if(v!=fa)
18             dfs(v,p[v]=u);
19     }
20 }
21
22 int dp(int cur,int f,int pa) {
23     if(d[cur][f]>0)
24         return d[cur][f];
25     if(f==1) {
26         d[cur][f] = 1;
27         for(int i=0;i<G[cur].size();i++) {
28             int v = G[cur][i];
29             if(v!=pa)
30             d[cur][f] +=min(dp(v,0,cur),dp(v,1,cur));
31         }
32     }
33     else {
34         for(int i=0;i<G[cur].size();i++) {
35             int v = G[cur][i];
36             if(v!=pa)
37                 d[cur][f] +=dp(v,1,cur);
38         }
39     }
40     return d[cur][f];
41 }
42
43
44 int main()
45 {
46     while(scanf("%d",&n)!=EOF) {
47
48         memset(d,0,sizeof(d));
49         for(int i=0;i<n;i++)
50             G[i].clear();
51         int u,v,num;
52         for(int i=0;i<n;i++) {
53             scanf("%d:(%d)",&u,&num);
54             for(int j=0;j<num;j++) {
55                 scanf("%d",&v);
56                 G[u].push_back(v);
57                 G[v].push_back(u);
58             }
59         }
60
61         p[0] = -1;
62         dfs(0,-1);
63         printf("%d\n",min(dp(0,0,-1),dp(0,1,-1)));
64
65     }
66     return 0;
67 }

时间: 2024-10-16 07:41:53

LA 2038 最少点覆盖的相关文章

LA 2038

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

hdu 1150 Machine Schedule 最少点覆盖

Machine Schedule Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1150 Description As we all know, machine scheduling is a very classical problem in computer science and has been studied for a very long history.

hdu 1150 Machine Schedule 最少点覆盖转化为最大匹配

Machine Schedule Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1150 Description As we all know, machine scheduling is a very classical problem in computer science and has been studied for a very long history.

LA 2038 Strategic game

题意即求一个最小顶点覆盖. 对于没有孤立点的图G=(V,E),最大独立集+最小顶点覆盖= V.(往最大独立集加点) 问题可以变成求树上的最大独立集合. 每个结点的选择和其父节点选不选有关, dp(u,1)表示父节点选,这时u不可选, dp(u,0)表示父节点不选,这时u可选可不选. #include<bits/stdc++.h> using namespace std; const int maxn = 1501; int meo[maxn][2]; int vis[maxn][2], clk

LA 2038 战略游戏(树的动态规划基础题/无根树转有根树/树的最大最小结点集)

题目大意就是求树的最小结点集,树上的动态规划基础题,一次深搜就可以解决问题 代码如下: #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #i

poj2226(最小点覆盖)

传送门:Muddy Fields 题意:一个由r行c列方格组成的田地,里面有若干个方格充满泥泞,其余方格都是草.要用长度不限,宽度为1的长木板来覆盖这些泥方格,但不能覆盖草地.最少要用多少个长木板. 分析:行列模型最小点覆盖,给连续行和列重新标号,然后每个字符*代表一条边,题目转换成用最少点覆盖所有的边(*). #include <cstdio> #include <cstring> #include <string> #include <cmath> #i

[SinGuLaRiTy] 贪心题目复习

[SinGuLaRiTy-1024] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. [POJ 2709] 颜料 (Painter) 题目描述 杂货店出售一种由N(3<=N<=12)种不同颜色的颜料,每种一瓶(50ML),组成的颜料套装.你现在需要使用这N种颜料:不但如此,你还需要一定数量的灰色颜料.杂货店从来不出售灰色颜料——也就是它不属于这N种之一.幸运的是,灰色颜料是比较好配置的,如果你取出三种不同颜色的颜料各x ml,混合起来就

POJ3041_Asteroids

这个题目说,有一个N*N的规格的方格.某些格子里有*号,每次可以消除一行或者一列中所有的*号.最少需要消多少次? 新学到的,什么什么定理,最少点覆盖等于最大匹配数. 这个定理可以这样来理解(看别人的),对于最大匹配状态下的一条匹配边,不可能两边同时存在可连的未匹配点,因为这样就可以增广了,所以对于一条匹配边,只要选取在其有未匹配点的一边的点就可以了,对于其他的匹配边同理. 接下来就是上模版的时候了... 召唤代码君: #include <cstdio> #include <vector&

POJ 1325 Machine Schedule 二分图最大匹配

把每一个任务看做一个边,机器的模式看做是一个点,这个其实就是求一个最少点覆盖所有边即最小点覆盖集的问题,因为最小点覆盖集=二分图的最大匹配,所以问题转化成了求二分图最大匹配问题. 第一次写二分图匹配,感觉建模还是相当困难的. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <strin