码迷,mamicode.com
首页 > 其他好文 > 详细

Perfect Service UVA - 1218(树形dp)

时间:2017-08-23 00:55:19      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:https   转移   今天   logs   space   splay   names   ems   class   

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)

标签:https   转移   今天   logs   space   splay   names   ems   class   

原文地址:http://www.cnblogs.com/yijiull/p/7414265.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!