Perfect Service UVA - 1218(树形dp)
Posted yijiull
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perfect Service UVA - 1218(树形dp)相关的知识,希望对你有一定的参考价值。
Perfect Service
题意:安装服务器,使得不是服务器的计算机恰好和一台服务器计算机相连。问最少安多少服务器计算机。
之前一直不理解第三个转移方程,,今天再看竟然是错的!!可是却过了!!
下面的是改过的了。
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 }
以上是关于Perfect Service UVA - 1218(树形dp)的主要内容,如果未能解决你的问题,请参考以下文章
UVA - 1218 Perfect Service(树形dp)
[UVA-1218] Perfect Service(树的最小支配集)
UVA-1220-Party at Hali-Bula && UVA-1218-Perfect Service(树形DP)