pku 1830 开关问题(构造矩阵+高斯消元)
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 4653 | Accepted: 1675 |
Description
Input
每组测试数据的格式如下:
第一行 一个数N(0 < N < 29)
第二行 N个0或者1的数,表示开始时N个开关状态。
第三行 N个0或者1的数,表示操作结束后N个开关的状态。
接下来 每行两个数I J,表示如果操作第 I 个开关,第J个开关的状态也会变化。每组数据以 0 0 结束。
Output
Sample Input
2 3 0 0 0 1 1 1 1 2 1 3 2 1 2 3 3 1 3 2 0 0 3 0 0 0 1 0 1 1 2 2 1 0 0
Sample Output
4 Oh,it's impossible~!!
Hint
一共以下四种方法:
操作开关1
操作开关2
操作开关3
操作开关1、2、3 (不记顺序)
Source
(我们设方程组中方程的个数为equ,变元的个数为var,注意:一般情况下是n个方程,n个变元,但是有些题目就故意让方程数与变元数不同)
1. 把方程组转换成增广矩阵。
2. 利用初等行变换来把增广矩阵转换成行阶梯阵。
枚举k从0到equ – 1,当前处理的列为col(初始为0) ,每次找第k行以下(包括第k行),col列中元素绝对值最大的列与第k行交换。如果col列中的元素全为0,那么则处理col + 1列,k不变。
3. 转换为行阶梯阵,判断解的情况。
① 无解
当方程中出现(0, 0, …, 0, a)的形式,且a != 0时,说明是无解的。
② 唯一解
条件是k = equ,即行阶梯阵形成了严格的上三角阵。利用回代逐一求出解集。
③ 无穷解。
条件是k < equ,即不能形成严格的上三角形,自由变元的个数即为equ – k,但有些题目要求判断哪些变元是不缺定的。
#include<stdio.h>
#include<string.h>
int a[33][33],n;
int gauss()
{int i,j,k,t,temp;for(i=j=1;i<=n&&j<=n;j++){for(k=j;k<=n;k++) if(a[k][j]) break;if(a[k][j]){for(t=1;t<=n+1;t++)temp=a[i][t],a[i][t]=a[k][t],a[k][t]=temp;for(t=1;t<=n;t++){if(t!=i&&a[t][j])for(k=1;k<=n+1;k++)a[t][k]^=a[i][k];}i++;}}for(k=i;k<=n;k++) if(a[k][n+1]) return -1;return 1<<(n-(i-1));
}
int main()
{int t,i,x,y,res;scanf("%d",&t);while(t--){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",&x);a[i][n+1]^=x,a[i][i]=1;}while(scanf("%d%d",&x,&y),x&&y) a[y][x]=1;res=gauss();if(res==-1) printf("Oh,it's impossible~!!\n");else printf("%d\n",res);}return 0;
}
pku 1830 开关问题(构造矩阵+高斯消元)相关推荐
- POJ 1830 开关问题 【01矩阵 高斯消元】
任意门:http://poj.org/problem?id=1830 开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 1 ...
- 开关问题(模板+高斯消元)
开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 7771 Accepted: 3058 Description ...
- CF1616F Tricolor Triangles(构造、高斯消元)
解析 关键性质:三元环合法等价于边权和模3等于0. 还有一个常识:三元环的级别是O(mm)O(m\sqrt m)O(mm). 证明: 三个点度数都大于 m\sqrt mm 的点不超过Cm3=mmC ...
- 【BZOJ3503】【Cqoi2014】和谐矩阵 高斯消元,解异或方程组
#include <stdio.h> int main() {puts("转载请注明出处");puts("地址:blog.csdn.net/vmurder/a ...
- hdu 5755 Gambler Bo 三进制高斯消元(开关问题变形)
题目链接 题意: 给出一个模3意义下的矩阵,每次选中一个元素就可以使得自身+2,上下左右元素+1.求所有元素变成0的一种解. 思路: 这个题目高斯消元复杂度明明是O(n^3)的啊,这个题O((n*m) ...
- bzoj 3503: [Cqoi2014]和谐矩阵(高斯消元)
3503: [Cqoi2014]和谐矩阵 Time Limit: 10 Sec Memory Limit: 128 MBSec Special Judge Submit: 1101 Solved ...
- 开关问题 POJ - 1830 高斯消元
开关问题 POJ - 1830 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变 ...
- POJ 1830 开关问题 高斯消元
题意:给你N个开关,其中某些开关之间是相互影响的,即一个开关控制多个,那么每个开关操作与否为一个变元,有N个变元,开关之间相互影响的系数设为1,否则为0,对模2高斯消元求解自由变元个数. #inclu ...
- poj 1830 开关问题 高斯消元
题目链接 高斯消元模板, 判断是否有解以及变元的数量. 1 #include <iostream> 2 #include <vector> 3 #include <cst ...
最新文章
- 屈才了!当程序员会写诗后...... | 每日趣闻
- 正确配置Linux系统ulimit值的方法
- 开始VC之路--创建窗体
- 使用C语言中的宏来定位出错信息
- axure 组件_技巧分享 | Axure后台组件制作的全过程
- [Python]网络爬虫(九):百度贴吧的网络爬虫(v0.4)源码及解析
- (HDOJ 2034)人见人爱A-B
- Python While 循环语句
- Python:程序生成Windows可执行文件/不显示命令执行窗口/无法生成exe报错TypeError: an integer is required (got type bytes)解决方法
- 个人电脑防止被入侵的设置方法。
- 通过apizza生成python接口测试代码
- Windows Server 无法启用 网络发现
- 第一章、Android基础入门 - Android移动开发基础笔记
- ios html fixed,关于IOS的Safari浏览器fixed定位失效的那些坑
- 计算机无法识别新挂硬盘,windows10系统添加新硬盘识别不了如何解决
- 织梦教程:DEDEcms还原数据后后台乱码
- Sentinel vs Hystrix 对比,你怎么选?
- Error: Unknown command: cask
- 听“前微软系”AI大牛讲“京东新生活”
- Unity3D 取消发布游戏启动时的设置窗口并窗口化运行