/*
我觉得挺对的啊 实在是考虑不到有什么情况会判不了
70分 就这样吧 - -
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<vector>
#define maxn 310
using namespace std;
int init()
{
int x=0;char s=getchar();
while(s<'0'||s>'9')s=getchar();
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
return x;
}
int n,m,c[maxn],son[maxn][maxn],sum[maxn],g[maxn][maxn],f[maxn];
int size[maxn],fa[maxn],ans=0x3f3f3f3f;
vector<int>so[maxn];
void Build(int i)
{
f[i]=1;
for(int j=0;j<so[i].size();j++)
{
int Son=so[i][j];
if(f[Son]==0)
{
fa[Son]=i;
son[i][++sum[i]]=Son;
Build(Son);
}
}
}
void Dfs(int i,int num)
{
int get=0;
if(num>=ans)return;
int Sum=0;
for(int j=1;j<=size[i];j++)
if(f[fa[g[i][j]]]==0)
{
Sum++;
get=1;
}
else f[g[i][j]]=1;
for(int j=1;j<=size[i];j++)
{
if(f[g[i][j]]==0)
{
f[g[i][j]]=1;
Dfs(i+1,num+Sum-1);
f[g[i][j]]=0;
for(int k=1;k<=sum[g[i][j]];k++)
f[son[g[i][j]][k]]=0;
}
}
if(get==0)
{
ans=min(ans,num);
return;
}
}
int main()
{
n=init();m=init();
int x,y;
c[1]=1;
for(int i=1;i<=m;i++)
{
x=init();y=init();
so[x].push_back(y);
so[y].push_back(x);
}
Build(1);
memset(f,0,sizeof(f));
size[1]=1;g[1][1]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=sum[i];j++)
{
int t=c[i]+1;
c[son[i][j]]=t;
g[t][++size[t]]=son[i][j];
}
Dfs(2,1);
printf("%d\n",ans);
return 0;
}
/*
看了题解之后的 感觉思路和自己的差不多 只不过这样清晰多了
(好吧 不止清晰 .....100分 -)
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define maxn 310
using namespace std;
int init()
{
int x=0;char s=getchar();
while(s<'0'||s>'9')s=getchar();
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
return x;
}
int n,m,Max_c,son[maxn][maxn],sum[maxn],c[maxn];
int ans=0x3f3f3f3f,num=1,f[maxn];
vector<int>so[maxn];
void Build(int i)
{
f[i]=1;
for(int j=0;j<so[i].size();j++)
{
int Son=so[i][j];
if(f[Son]==0)
{
son[i][++sum[i]]=Son;
Build(Son);
}
}
}
void Dfs(int p)
{
int get=0;
if(num>=ans)return;
int Sum=0;
for(int i=1;i<=n;i++)
if(c[i]==p)
for(int j=1;j<=sum[i];j++)
{
get=1;
c[son[i][j]]=p+1;
num++;
}
num--;
for(int i=1;i<=n;i++)
if(c[i]==p+1)
{
c[i]=0;
Dfs(p+1);
c[i]=p+1;
}
num++;
for(int i=1;i<=n;i++)
if(c[i]==p+1)
{
c[i]=0;num--;
}
if(get==0)
{
ans=min(ans,num);
return;
}
}
int main()
{
n=init();m=init();
int x,y;
c[1]=1;
for(int i=1;i<=m;i++)
{
x=init();y=init();
so[x].push_back(y);
so[y].push_back(x);
}
Build(1);
for(int i=1;i<=n;i++)
for(int j=1;j<=sum[i];j++)
{
int t=c[i]+1;
Max_c=max(Max_c,t);
c[son[i][j]]=t;
}
memset(c,0,sizeof(c));
c[1]=1;
Dfs(1);
printf("%d\n",ans);
return 0;
}