94分求助!
查看原帖
94分求助!
308379
Daniel2020楼主2021/4/3 12:01

第十四个样例点WA了QAQ

特在此求助巨佬

TAT答案明明是8偏偏输出10
P.S. 程序中的out是输出矩阵的:(
#include<bits/stdc++.h>
using namespace std;
const int N = 40,M = 600;
unsigned long long a[N],b[N];
bool f[N];
int n,m,x,y,ans;
void out(int l,int r,bool b)
{
	for(int i = l;i <= r;i++)
	{
		if(b || a[i] != 0)
		{
			for(int j = n;j >= 1;j--)
				cout<<(a[i]>>j&1)<<' ';
			cout<<"| "<<(a[i]&1)<<endl;
		}
	}
	cout<<endl;
}
void dfs(int X,int num)
{
	if(num >= ans) return;
	if(X == 0){ans = num;return;}
	if(a[X]>>(n-X+1)&1)
	{
		bool v = a[X]&1;
		for(int i = X+1;i <= n;i++)
			if(a[x]>>(n-i+1)&1)
				v ^= f[i];
		dfs(X-1,num+v);
	}
	else
	{
		dfs(X-1,num);
		f[X] = 1;
		dfs(X-1,num+1);
		f[X] = 0;
	}
}
int main()
{
	cin>>n>>m;
	for(int i = 1;i <= n;i++) a[i] = pow(2,i)+1;
	for(int i = 1;i <= m;i++)
	{
		cin>>x>>y;
		a[x] |= 1<<y;
		a[y] |= 1<<x;
	}
	for(int i = 1;i <= n;i++)
	{
		for(int j = i+1;j <= n;j++)
			if(a[j] > a[i]) swap(a[i],a[j]);
		if(a[i] == 0)
		{
			for(int j = 1;j <= n;j++)
				for(int k = n;k >= 1;k--)
					if(a[j]>>k&1){b[n-k+1] = a[j];break;}
			for(int j = 1;j <= n;j++)
				a[j] = b[j];
			ans = 999999999;
			dfs(n,0);
			cout<<ans;
			return 0;
		}
		for(int k = n;k;k--)
			if(a[i]>>k&1)
			{
				for(int j = 1;j <= n;j++)
					if((i != j) && (a[j]>>k&1)) a[j] ^= a[i];
				break;
			}
	}
	for(int i = 1;i <= n;i++) ans += a[i]&1;
	cout<<ans;
	return 0;
}
2021/4/3 12:01
加载中...