【POJ1830】开关问题 高斯消元求自由元

#include <stdio.h>
int main()
{
	puts("转载请注明出处[vmurder]谢谢");
	puts("网址:blog.csdn.net/vmurder/article/details/43482357");
}


题意:中文题。


题解:

呃,求自由元个数,然后输出1<<ans;(自由元就是高斯消元消某个变量x时发现以下所有方程当前此位系数都是0)

如果无解输出那个题中给的串。


诶网上代码真不可看,我绝望了决定照自己想法随便写写。

然后49行没压行搞过去了。

网上全是100行+什么心态。


然后还复杂难看。


代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 40
#define inf 0x3f3f3f3f
using namespace std;

bool a[N][N],ans[N];

int Gauss(int n,int m)
{
	int i,j,k,ret=0,id;
	for(id=i=1;i<n;i++,id++)
	{
		for(j=id;j<=m&&!a[j][i];j++);
		if(j>m){id--,ret++;continue;}
		if(id!=j)for(k=i;k<=n;k++)swap(a[id][k],a[j][k]);
		for(j=id+1;j<=m;j++)if(a[j][i])for(k=i;k<=n;k++)
			a[j][k]^=a[id][k];
	}
	for(i=id;i<=m;i++)if(a[i][n])return -1;
	return ret;
}
int n;
int main()
{
//	freopen("test.in","r",stdin);

	int i,j,k,g;
	int x,y;
	for(scanf("%d",&g);g--;)
	{
		memset(a,0,sizeof a);

		scanf("%d",&n);
		for(i=1;i<=n;i++)scanf("%d",&a[i][n+1]);
		for(i=1;i<=n;i++)scanf("%d",&k),a[i][n+1]^=k;
		for(i=1;i<=n;i++)a[i][i]=1;
		while(scanf("%d%d",&x,&y),x+y)a[y][x]=1;
		
		x=Gauss(n+1,n);
		if(x==-1)puts("Oh,it's impossible~!!");
		else printf("%d\n",1<<x);
	}
	return 0;
}


你可能感兴趣的:(高斯消元,开关问题,POJ1830,求自由元)