https://www.luogu.org/problem/P1041
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define sc(x) scanf("%lld",&x);
const int maxn = 1000;
int n,m,tot=1,ans=5000;
int c[maxn];
vector<int>son[maxn];
int G[maxn][maxn];
void dfs(int i,int fa)
{
for(int j=1; j<=n; j++)
{
int x=G[i][j];
//cout<<i<<' '<<fa<<'\n';
if(x!=0)
{
x=j;
// cout<<i<<" zenmehuishi "<<x<<'\n';
if(x!=fa)
{
son[i].push_back(x);
dfs(x,i);
}
}
}
}
void solve(int p)
{
bool f=0;
if(ans<=tot) return;
for(int i=1; i<=n; i++)
{
if(c[i]==p)
{
for(int j=0; j<son[i].size(); j++)
{
f=1;
tot++;
c[son[i][j]]=p+1;
}
}
}
tot--;
for(int i=1; i<=n; i++)
{
if(c[i]==p+1)
{
c[i]=0;///剪掉
solve(p+1);
c[i]=p+1;
}
}///儿子的儿子
tot++;
for(int i=1; i<=n; i++)
{
if(c[i]==p+1)
{
c[i]=0;
tot--;
}
}
if(!f)//标记是否有儿子
{
ans=min(ans,tot);
return;
}
}
signed main()
{
int x,y;
sc(n);
sc(m);
c[1]=1;
for(int i=1; i<=m; i++)
{
sc(x);
sc(y);
G[x][y]=1;
G[y][x]=1;
}
dfs(1,-1);
/* for(int i=1; i<=n; i++)
{
cout<<son[i].size()<<' ';
}*/
solve(1);
cout<<ans<<'\n';
return 0;
}