uva 1218

错误答案 待修正

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<vector>
#include<sstream>
#include<cmath>
#include<queue>
#include<cctype>
#include<set>
#include<map>
#include<unordered_set>
using namespace std;

const int maxn = 10000+10, inf = 1000000000;
int N;
int d[maxn][3], p[maxn];
bool visit[maxn], Search[maxn][3];
vector<int>v[maxn];

void dfs(int u, int fa) {
  visit[u] = true;
  p[u] = fa;
  for(int i = 0; i < (int)v[u].size(); i++) {
    int k = v[u][i];
    if(visit[k]) continue;
    dfs(k, u);
  }
}

int dp(int u,int k){
   if(Search[u][k]) return d[u][k];
   if(k == 0){
        d[u][k] = 1;
        for(int j = 0; j < (int)v[u].size(); j++)
            if(p[u] != v[u][j])
               d[u][k] += min(dp(v[u][j],0),dp(v[u][j],1));
   }
   else if(k == 1){
        d[u][k] = 0;
        for(int j = 0; j < (int)v[u].size(); j++)
            if(p[u] != v[u][j])
               d[u][k] += dp(v[u][j],2);
   }
   else{
        d[u][k] = inf;
        for(int j = 0; j < (int)v[u].size(); j++)
            if(p[u] != v[u][j])
                d[u][k] = min(d[u][k], dp(u,1) - dp(v[u][j],2) + dp(v[u][j],0));
   }
   Search[u][k] = true;
   return d[u][k];
}

int main(){
   while(scanf("%d", &N) == 1) {
      for(int i = 1;i <= N; i++) v[i].clear();
      memset(d,-1,sizeof(d));
      memset(visit,false,sizeof(visit));
      memset(Search,false,sizeof(Search));
      for(int i = 0; i < N-1; i++){
          int a,b;
          scanf("%d%d",&a,&b);
          v[a-1].push_back(b-1); v[b-1].push_back(a-1);
      }
      dfs(0,-1);
      printf("%d\n",min(dp(0,0),dp(0,2)));
      scanf("%d", &N);
   }
   return 0;
}

猜你喜欢

转载自blog.csdn.net/a874288174/article/details/80038040