Perfect Service UVA - 1218(树形dp)

Posted yijiull

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perfect Service UVA - 1218(树形dp)相关的知识,希望对你有一定的参考价值。

Perfect Service

 UVA - 1218

题意:安装服务器,使得不是服务器的计算机恰好和一台服务器计算机相连。问最少安多少服务器计算机。

之前一直不理解第三个转移方程,,今天再看竟然是错的!!可是却过了!!

下面的是改过的了。

技术分享
 1 #include <cstdio>
 2 #include <bits/stdc++.h>
 3 using namespace std;
 4 const int maxn=10010;
 5 int d[maxn][3];
 6 int in[maxn];
 7 struct edge{
 8     int v,nex;
 9 }e[maxn<<1];
10 int head[maxn];
11 int cnt;
12 void add(int u,int v){
13     e[cnt].v=v;
14     e[cnt].nex=head[u];
15     head[u]=cnt++;
16 }
17 int n;
18 void dfs(int u,int f){
19     d[u][2]=maxn;  //!!!不合法
20     d[u][0]=1;
21     d[u][1]=0;
22     for(int i=head[u];i!=-1;i=e[i].nex){
23         int v=e[i].v;
24         if(v==f) continue;
25         dfs(v,u);
26         d[u][0]+=min(d[v][0],d[v][1]);
27         d[u][1]+=d[v][2]; //如果maxn过大这里可能会溢出导致错误!
28     }
29     for(int i=head[u];i!=-1;i=e[i].nex){
30         int v=e[i].v;
31         if(v==f) continue;
32         d[u][2]=min(d[u][2],d[u][1]-d[v][2]+d[v][0]);
33     }
34     return ;
35 }
36 int main(){
37     int u,v;
38     while(scanf("%d",&n)&&n!=-1){
39         cnt=0;
40         memset(head,-1,sizeof(head));
41         memset(d,0,sizeof(d));
42         memset(in,0,sizeof(in));
43         for(int i=1;i<n;i++){
44             scanf("%d%d",&u,&v);
45             add(u,v);
46             add(v,u);
47         }
48         dfs(1,0);
49         printf("%d\n",min(d[1][0],d[1][2]));
50         scanf("%d",&u);
51         if(u==0) continue;
52         else break;
53     }
54 }
View Code

 

以上是关于Perfect Service UVA - 1218(树形dp)的主要内容,如果未能解决你的问题,请参考以下文章

题解UVA1218 Perfect Service

UVA - 1218 Perfect Service(树形dp)

[UVA-1218] Perfect Service(树的最小支配集)

uva1218 Perfect Service

UVA-1220-Party at Hali-Bula && UVA-1218-Perfect Service(树形DP)

UVA - 10622 Perfect P-th Powers