就是细节多一些,思路都非常常规.
Code:
#include <bits/stdc++.h> #define N 1005 #define inf 1061109567 #define ll long long #define setIO(s) freopen(s".in","r",stdin) using namespace std; int n,edges; int hd[N],to[N<<1],nex[N<<1],f[N][7]; void add(int u,int v) { nex[++edges]=hd[u],hd[u]=edges,to[edges]=v; } void dfs(int x,int ff) { f[x][2]=1; f[x][3]=f[x][4]=0; int sum=0,sum2=0,aa=0,bb=0; for(int i=hd[x];i;i=nex[i]) { int v=to[i]; if(v==ff) continue; dfs(v,x); f[x][2]+=min(min(min(f[v][0],f[v][1]), min(f[v][2], f[v][3])), f[v][4]); sum+=min(f[v][0], f[v][1]); sum2+=min(min(f[v][0], f[v][1]), min(f[v][2], f[v][3])); aa+=f[v][0]; bb+=f[v][3]; } if(abs(aa)<=n) f[x][3]=aa; else f[x][3]=inf; if(abs(bb)<=n) f[x][4]=bb; else f[x][4]=inf; for(int i=hd[x];i;i=nex[i]) { int v=to[i]; if(v==ff) continue; if(abs(sum)<=n) f[x][0]=min(f[x][0], sum+f[v][1]-min(f[v][1],f[v][0])); if(abs(sum2)<=n) f[x][1]=min(f[x][1], sum2+f[v][2]-min(min(f[v][0], f[v][1]), min(f[v][2], f[v][3]))); } f[x][3]=min(min(min(f[x][0], f[x][1]), f[x][2]), f[x][3]); f[x][4]=min(f[x][3], f[x][4]); } int main() { int i,j,k; // setIO("input"); scanf("%d",&n); for(i=2;i<=n;++i) { int x; scanf("%d",&x),add(i,x),add(x,i); } memset(f,0x3f,sizeof(f)); dfs(1,0); printf("%d ",min(min(f[1][0], f[1][1]), f[1][2])); return 0; }