INF不能弄太大,因为会不停地累加很多次,事实上加三次就爆了。INF一直习惯了用0X3F3F3F3F,这不好,特别是DP时状态转移需要累加的情况,应该弄得比可能的上界再大一点点就好了。或者你可以不停地判断,让值最高只能达到INF。
代码
#include<bits/stdc++.h>
#define maxn 10010
#define INF 10010
using namespace std;
int N;
vector<int>MAP[maxn];
int dp[3][maxn];
void dfs(int u,int f)
{
dp[0][u]=1;
dp[1][u]=0;
dp[2][u]=INF;
for(unsigned int i=0;i<MAP[u].size();i++)
{
int v=MAP[u][i];
if(v==f) continue;
dfs(v,u);
dp[0][u]+=min(dp[0][v],dp[1][v]);
dp[1][u]+=dp[2][v];
}
for(unsigned int i=0;i<MAP[u].size();i++)
{
int v=MAP[u][i];
if(v==f) continue;
dp[2][u]=min(dp[2][u],dp[1][u]-dp[2][v]+dp[0][v]);
}
}
int main()
{
do
{
scanf("%d",&N);
for(int i=0;i<=N;i++) MAP[i].clear();
int u,v;
for(int i=1;i<N;i++)
{
scanf("%d %d",&u,&v);
MAP[u].push_back(v);
MAP[v].push_back(u);
}
dfs(1,0);
printf("%d\n",min(dp[0][1],dp[2][1]));
}while(scanf("%d",&N),!N);
return 0;
}