poj1830 开关问题
来源:互联网 发布:淘宝交易货款延期延长 编辑:程序博客网 时间:2024/06/05 16:28
传送门
高斯消元。
对于每一个开关都有两种选择,我们只需要对于每个开关以及对应结果用高斯消元求解亦或方程即可,有多少自由元答案就是2的几次方。
好像用bitset会更快,但是并不会用,改天学学。
CODE:
#include<cstdio>#include<cstring>#include<iostream>using namespace std;int f[50][50];int T,n,x,y;inline int gauss(){ int ans=0; for(int i=1;i<=n;i++) { if(!f[i][i]) { int p=i; for(int j=i+1;j<=n;j++) if(f[j][i]){p=j;break;} if(p!=i) for(int j=1;j<=n+1;j++) swap(f[p][j],f[i][j]); } if(!f[i][i]){ans++;continue;} for(int j=1;j<=n;j++) if(j!=i&&f[j][i]) for(int k=1;k<=n+1;k++) f[j][k]^=f[i][k]; } for(int i=1;i<=n;i++) { bool all=1; for(int j=1;j<=n;j++) if(f[i][j]){all=0;break;} if(all&&f[i][n+1]) return -1; } return ans;}int main(){ scanf("%d",&T); while(T--) { memset(f,0,sizeof(f)); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&f[i][n+1]); for(int i=1;i<=n;i++) scanf("%d",&x),f[i][n+1]^=x; scanf("%d%d",&x,&y); while(x&&y) f[y][x]=1,scanf("%d%d",&x,&y); for(int i=1;i<=n;i++) f[i][i]=1; int ans=gauss(); if(ans==-1) printf("Oh,it's impossible~!!\n"); else printf("%d\n",1<<ans); } return 0;}
阅读全文
0 0
- poj1830 开关问题 高斯消元
- POJ1830--开关问题
- POJ1830 开关问题【高斯消元法】
- POJ1830 开关问题 高斯消元
- POJ1830 开关问题【 高斯消元】
- POJ1830 开关问题
- POJ1830开关问题-高斯消元
- [poj1830]: 开关问题
- poj1830 开关问题
- poj1830 开关问题(gauss)
- [POJ1830]开关问题(高斯消元)
- poj1830--开关问题(高斯消元问题1)
- 【POJ1830】开关问题 高斯消元求自由元
- 深度优先算法解决POJ1830开关问题
- POJ1830开关问题——gauss消元
- poj1830 高斯消元[3](经典的开关问题)
- poj1830
- poj1830
- 基于结巴分词的基础中文词语去歧实现
- windows环境下Tensorflow的安装
- 算法导论红黑树实现
- Java小项目之GUI界面动态图的移动
- UnityShader入门精要学习笔记(一):渲染流水线
- poj1830 开关问题
- console.log()与alert()对比使用及console.log()使用注意事项
- HDFS操作-命令行接口
- mysql的共享连接
- bat批处理字符串截取补充
- GitHub本地上传项目到远程库的基本流程
- JS异步之async函数
- AFIO---端口IO功能复用时钟
- shell--条件判断与测试