wrong answer to be corrected
#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; }