1. 程式人生 > >Perfect Service UVA - 1218(樹形dp)

Perfect Service UVA - 1218(樹形dp)

pen perf name isp 技術 get sca code esp

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)