题目链接: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