【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 0x3f3f3f3fusing 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】开关问题 高斯消元求自由元

相关文章:

你感兴趣的文章:

标签云: