本人的80分程序:
#include<bits/stdc++.h>
using namespace std;
const int mxn=501;
int n,p,m,i,j,x,y,ans=1006,sum=0;
int vis[mxn],dp[mxn][mxn],cnt[mxn];
struct edge{
int father,chid[mxn],num;
}node[mxn];
void Input(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
node[i].num=0;
cnt[i]=1;
}
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
if(x>y) swap(x,y);
node[y].father=x;
node[x].num++;
node[x].chid[node[x].num]=y;
}
}
void deep(int tree,int s){
sum=max(sum,s);
for(int i=1;i<=node[tree].num;i++){
dp[s][0]++;
dp[s][dp[s][0]]=node[tree].chid[i];
deep(node[tree].chid[i],s+1);
}
}
int Count(int tree){
for(int i=1;i<=node[tree].num;i++){
cnt[tree]+=Count(node[tree].chid[i]);
}
return cnt[tree];
}
void work(int tree,int teg){
for(int i=1;i<=node[tree].num;i++){
vis[node[tree].chid[i]]=teg;
work(node[tree].chid[i],teg);
}
}
void DFS(int s,int e){
if(s==sum) ans=min(ans,e);
int f=0;
for(int i=1;i<=dp[s][0];i++){
if(vis[dp[s][i]]>0){
f++;
continue;
}
vis[dp[s][i]]=1;
work(dp[s][i],1);
DFS(s+1,e-cnt[dp[s][i]]);
vis[dp[s][i]]=0;
work(dp[s][i],0);
}
}
int main(){
Input();
deep(1,2);
Count(1);
DFS(2,n);
printf("%d",ans);
return 0;
}