求助
查看原帖
求助
230804
Durancer楼主2020/12/1 11:33

思路:通过枚举所有状态并找出符合题目条件的两种状态,然后依次判断,比较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;
}

2020/12/1 11:33
加载中...