参考了lrj的代码,思路很清晰,让我自己写恐怕不会写得这么清晰。
顺便学习了一下vector,毕竟以前不怎么用c++。
Perfect Service
//d[i][2] 都不是服务器 d[i][1] pearent is sever d[i][0] sever
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
const int maxn = 10000+5;
const int INF = 100000000;
vector<int> G[maxn],ver;
int n,m,i,j,v,u;
int p[maxn],d[maxn][3];
void dfs(int u,int fa){
ver.push_back(u);
p[u]=fa;
int i,v;
for(i=0; i<G[u].size(); i++){
v=G[u][i];
if(fa!=v) dfs(v,u);
}
}
int main(){
while(m!=-1){
scanf("%d", &n);
for(i=1; i<=n; i++) G[i].clear();
for(i=0; i<n-1; i++){
scanf("%d%d", &u, &v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(1,-1);
for(i=ver.size()-1; i>=0; i--){
u=ver[i];
d[u][1]=0; d[u][0]=1;
for(j=0; j<G[u].size(); j++){
v=G[u][j];
if(v==p[u]) continue;
d[u][1]+=d[v][2];
d[u][0]+=min(d[v][0],d[v][1]);
}
d[u][2]=INF;
for(j=0; j<G[u].size(); j++){
v=G[u][j];
if(v==p[u]) continue;
d[u][2]=min(d[u][2],d[u][1]-d[v][2]+d[v][0]);
}
}
printf("%d\n",min(d[1][0],d[u][2]));
scanf("%d",&m);
}
return 0;
}