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
",min(dp(0,0,-1),dp(0,1,-1)));
64 
65     }
66     return 0;
67 }
View Code
原文地址:https://www.cnblogs.com/TreeDream/p/6792073.html