#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <string>
#include <time.h>
#include <math.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
typedef long long ll;
const int maxn=10010;
const int maxm=60;
bool G[maxm][maxn];
int ans;
struct DLX{
int L[maxn],R[maxn],U[maxn],D[maxn];
int size,col[maxn],S[maxn],H[maxn];
bool vis[maxm];
void init(int m){
for(int i=0;i<=m;i++){
L[i]=i-1;
R[i]=i+1;
U[i]=D[i]=i;
S[i]=0;
}
memset(H,-1,sizeof(H));
L[0]=m;R[m]=0;
size=m+1;
}
void del(int c){
for(int i=D[c];i!=c;i=D[i]){
L[R[i]]=L[i];
R[L[i]]=R[i];
}
}
void RR(int c)
{
int i;
for(i=U[c];i!=c;i=U[i])
L[R[i]]=R[L[i]]=i;
}
void link(int r,int c){
U[size]=c;
D[size]=D[c];
U[D[c]]=size;
D[c]=size;
if(H[r]<0)H[r]=L[size]=R[size]=size;
else {
L[size]=H[r];
R[size]=R[H[r]];
L[R[H[r]]]=size;
R[H[r]]=size;
}
S[c]++;col[size++]=c;
}
int A(){
int i,j,k,res;
memset(vis,0,sizeof(vis));
for(res=0,i=R[0];i;i=R[i])
if(!vis[i]){
res++;
vis[i]=1;
for(j=D[i];j!=i;j=D[j])
for(k=R[j];k!=j;k=R[k])
vis[col[k]]=1;
}
return res;
}
void dance(int now){
if(R[0]==0)ans=min(ans,now);
else if(now+A()<ans){
int i,j,temp,c;
for(temp=INF,i=R[0];i;i=R[i])
if(temp>S[i])temp=S[i],c=i;
for(i=D[c];i!=c;i=D[i]){
del(i);
for(j=R[i];j!=i;j=R[j])del(j);
dance(now+1);
for(j=L[i];j!=i;j=L[j])RR(j);
RR(i);
}
}
}
}dlx;
int main()
{
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
int i,j,k,m,n,v,u;
while(~scanf("%d%d",&n,&m)){
dlx.init(n);
memset(G,0,sizeof(G));
while(m--){
scanf("%d%d",&u,&v);
G[u][v]=G[v][u]=1;
}
for(i=1;i<=n;i++){
G[i][i]=1;
for(j=1;j<=n;j++)
if(G[i][j])
dlx.link(i,j);
}
ans=INF;
// cout<<"hahha"<<endl;
dlx.dance(0);
cout<<ans<<endl;
}
return 0;
}
tjut 3498
最新推荐文章于 2019-01-27 21:10:00 发布