User: 传染病控制
Time: 2019-10-04 22:37:52
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int n,p;
struct node{

 int num;
 int child[310];
}tree[313];
int deep[310][310],vis[310]={0},num[310];
int maxdeep=0,Ans=0x3f3f3f3f;
void getdeep(int now,int nowdeep){
  maxdeep = max(nowdeep,maxdeep);
  for(int i=1;i<=tree[now].num;i++){
      deep[nowdeep][0]++;
      deep[nowdeep][deep[nowdeep][0]] = tree[now].child[i];
      getdeep(tree[now].child[i],nowdeep+1);
  }
}
void flag(int nownode,int tag){
  vis[nownode] = tag;
  for(int i=1;i<=tree[nownode].num;i++){

    flag(tree[nownode].child[i],tag);
  }
}
int getnum(int nownode){
   for(int i=1;i<=tree[nownode].num;i++){
     num[nownode]+=getnum(tree[nownode].child[i]);
   }
   return num[nownode];
}
void dfs(int now,int ans){
  if(now==maxdeep){
    Ans = min(Ans,ans);
    return;
  }
  int tot = 0;
  for(int i=1;i<=deep[now][0];i++){
      if(vis[deep[now][i]]){
            tot++;
            continue;
        }

       //标记此节点的字树为1
       flag(deep[now][i],1);
       dfs(now+1,ans-num[deep[now][i]]);
      // 标记此节点的字树为0
       flag(deep[now][i],0);
  }
  if(tot==deep[now][0]){
      Ans = min(Ans,ans);
  }
}
int main()
{
    for(int i=1;i<310;i++)tree[i].num =0 ;
    cin>>n>>p;
    for(int i=0;i<310;i++){
        num[i] = 1;
    }
    for(int i=1;i<=p;i++){
        int x,y;
        cin>>x>>y;
        if(x>y)swap(x,y);

        tree[x].num++;
        tree[x].child[tree[x].num] = y;
    }
    getdeep(1,2);
    getnum(1);
    dfs(2,n);
    cout<<Ans<<endl;
 //   cout<<maxdeep<<endl;
    return 0;
}