思路:通过枚举所有状态并找出符合题目条件的两种状态,然后依次判断,比较QAQ,哪里挂了鸭QWQ,求找错
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#include<cstring>
using namespace std;
const int N=30;
int head[N],cnt,n,m;
int ans=0x3f3f3f3f,put;
struct node {
int last;
int to;
} e[N*N];
void add(int from,int to)
{
e[++cnt].last=head[from];
e[cnt].to=to;
head[from]=cnt;
}
int main()
{
cin>>n>>m;
for(int i=1; i<=m; i++)
{
int x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
for(int i=1; i<(1<<n); i++)
{
int j=((1<<n)-1);
j-=i;
if((i|j)!=((1<<n)-1))continue;
if((i&j)) continue;//有香蕉的点
int shu=i,num=0;
for(int k=1; k<=n; k++)
{
if(shu&1) num++;
shu>>=1;
}
if(shu!=(n/2)) continue;
int k=i,sum=0;
for(int q=1; q<=n; q++)
{
if(k&1)
{
for(int x=head[q]; x; x=e[x].last)
{
int y=e[x].to;
if(y&j) sum++;//有交集
}
}
k>>=1;
}
if(ans>sum)
{
ans=sum;
put=i;
}
}
for(int i=1; i<=n; i++)
{
if(put&1)
cout<<i<<endl;
put>>=1;
}
return 0;
}