树形DP
Perfect Service
Description A network is composed of N computers connected by N ? 1 communication links such that any two computers can be communicated via a unique route. Two computers are said to be adjacent if there is a communication link between them. We assume that N (≤ 10000) is a positive integer and these N computers are numbered from 1 to N. For example, Figure 1 illustrates a network comprised of six computers, where black nodes represent servers and white nodes represent Your task is to write a program to compute the perfect service number. Input The input consists of a number of test cases. The format of each test case is as follows: The first line contains one positive integer, N, which represents the number of computers in the network. The next N ? 1 lines contain all of the The next test case starts after the previous ending symbol 0. A ?1 indicates the end of the whole inputs. Output The output contains one line for each test case. Each line contains a positive integer, which is the perfect service number. Sample Input 6 1 3 2 3 3 4 4 5 4 6 0 2 1 2 -1 Sample Output 2 1 Source |
[Submit] [Go Back] [Status]
[Discuss]
/* *********************************************** Author :CKboss Created Time :2015年02月22日 星期日 12时09分02秒 File Name :POJ3398_2.cpp ************************************************ */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <cmath> #include <cstdlib> #include <vector> #include <queue> #include <set> #include <map> using namespace std; const int maxn=11000; const int INF=1e6; struct Edge { int to,next; }edge[maxn*2]; int Adj[maxn],Size; int dp[maxn][3],n; void init() { Size=0; for(int i=0;i<=n+10;i++) { Adj[i]=-1; dp[i][0]=1; dp[i][1]=0; dp[i][2]=INF; } } void add_edge(int u,int v) { edge[Size].to=v; edge[Size].next=Adj[u]; Adj[u]=Size++; } void dfs(int u,int fa) { for(int i=Adj[u];~i;i=edge[i].next) { int v=edge[i].to; if(v==fa) continue; dfs(v,u); dp[u][0]+=min(dp[v][0],dp[v][1]); dp[u][1]+=dp[v][2]; dp[u][2]=min(dp[u][2],dp[v][0]-dp[v][2]); } dp[u][2]+=dp[u][1]; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while(scanf("%d",&n)!=EOF) { if(n==-1) break; else if(n==0) continue; init(); for(int i=0;i<n-1;i++) { int a,b; scanf("%d%d",&a,&b); add_edge(a,b); add_edge(b,a); } dfs(1,0); printf("%d\n",min(dp[1][0],dp[1][2])); } return 0; }