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;
}