(模板)poj1681 高斯消元法求异或方程组(无解、唯一解、多解)
题目链接:https://vjudge.net/problem/POJ-1681
题意:类似于poj1222,有n×n的01矩阵,翻转一个点会翻转其上下左右包括自己的点,求最少翻转多少点能使得矩阵全0。
思路:
同样的可以枚举第一行的状态,这里不说了。
用高斯消元法来解这道题,每个点的状态表示一个变量,那么有n*n个方程,n*n个变量的方程组,用高斯消元法来解,可能存在无解,唯一解,多解的情况。多解的时候要枚举自由变元的状态。
AC代码:
/*
poj1681
开关问题,高斯消元法解异或方程组
求最少要翻转的开关使得矩阵全0
存在无解,唯一解,多解的情况
多解时要枚举自由变元的状态
*/
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<cstring>
using namespace std; const int maxn=;
const int inf=0x3f3f3f3f;
int T,n,equ,var,a[maxn][maxn],x[maxn],free_xx[maxn];
int ans;
char s[]; void init(){ //初始化
memset(a,,sizeof(a));
for(int i=;i<n;++i){
for(int j=;j<n;++j){
int t=i*n+j;
a[t][t]=;
if(i>) a[t][(i-)*n+j]=;
if(i<n-) a[t][(i+)*n+j]=;
if(j>) a[t][i*n+j-]=;
if(j<n-) a[t][i*n+j+]=;
}
}
} int Gauss(){
int r=,cnt=; //cnt表示自由变元个数
for(int c=;r<equ&&c<var;++r,++c){
int Maxr=r;
for(int i=r+;i<equ;++i)
if(abs(a[i][c])>abs(a[Maxr][c]))
Maxr=i;
if(Maxr!=r){
for(int i=c;i<var+;++i)
swap(a[Maxr][i],a[r][i]);
}
if(!a[r][c]){
--r;
free_xx[cnt++]=c;
continue;
}
for(int i=r+;i<equ;++i){
if(!a[i][c]) continue;
for(int j=c;j<var+;++j)
a[i][j]^=a[r][j];
}
}
for(int i=r;i<equ;++i)
if(a[i][var])
return -; //无解
return var-r; //返回自由变元的个数,cnt=var-r
} int solve(int t){
ans=inf;
for(int i=;i<(<<t);++i){ //枚举自由变元的状态
int cnt=; //要翻转的个数
memset(x,,sizeof(x));
for(int j=;j<t;++j){
if((i>>j)&){
++cnt;
x[free_xx[j]]=;
}
}
for(int j=var-t-;j>=;--j){
int tmp=a[j][var],tp,ok=;
for(int k=j;k<var;++k){
if(!a[j][k]) continue;
if(ok){ //找主元
ok=;
tp=k;
}
else{
tmp^=x[k];
}
}
x[tp]=tmp;
cnt+=x[tp];
}
ans=min(ans,cnt); //取最小
}
return ans;
} int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
init();
equ=var=n*n;
for(int i=;i<n;++i){
scanf("%s",s);
for(int j=;j<n;++j)
if(s[j]=='y') a[i*n+j][n*n]=;
else a[i*n+j][n*n]=;
}
int t=Gauss();
if(t==-)
printf("inf\n");
else
printf("%d\n",solve(t));
}
return ;
}
(模板)poj1681 高斯消元法求异或方程组(无解、唯一解、多解)的更多相关文章
- poj1753 (高斯消元法求异或方程组)
题目链接:http://poj.org/problem?id=1753 题意:经典开关问题,和poj1222一样,进行两次高斯消元即可,只用初始化的时候改一下初始状态.可能存在无解或多解的情况,多解要 ...
- 洛谷P3389 【模板】高斯消元法(+判断是否唯一解)
https://www.luogu.org/problemnew/show/P3389 这里主要说说怎么判断不存在唯一解 我们把每一行的第一个非零元称为关键元 枚举到一个变量,如果剩下的行中该变量的系 ...
- 洛谷P3389 【模板】高斯消元法
P3389 [模板]高斯消元法 题目背景 Gauss消元 题目描述 给定一个线性方程组,对其求解 输入输出格式 输入格式: 第一行,一个正整数 n 第二至 n+1行,每行 n+1 个整数,为a1,a ...
- 「LuoguP3389」【模板】高斯消元法
题目背景 Gauss消元 题目描述 给定一个线性方程组,对其求解 输入输出格式 输入格式: 第一行,一个正整数 nn 第二至 n+1n+1行,每行 n+1n+1 个整数,为a_1, a_2 \cdot ...
- P3389 【模板】高斯消元法
高斯消元求解n元一次线性方程组的板子题: 先举个栗子: • 2x + y - z = 8-----------① •-3x - y + 2z = -11---------② •-2x + y + ...
- 洛谷——P3389 【模板】高斯消元法
P3389 [模板]高斯消元法 以下内容都可省略,直接转大佬博客%%% 高斯消元总结 只会背板子的蒟蒻,高斯消元是什么,不知道诶,看到大佬们都会了这个水题,蒟蒻只好也来切一切 高斯消元最大用途就是解多 ...
- 题解 P3389 【【模板】高斯消元法】
题解 P3389 [[模板]高斯消元法] 看到大家都没有重载运算符,那我就重载一下运算符给大家娱乐一下 我使用的是高斯-约旦消元法,这种方法是精度最高的(相对地) 一句话解释高斯约旦消元法: 通过加减 ...
- [Luogu 3389]【模板】高斯消元法
Description 给定一个线性方程组,对其求解 Input 第一行,一个正整数 n 第二至 n+1 行,每行 n+1 个整数,为a1,a2⋯an和 b,代表一组方程.1,a2⋯an ...
- LG3389 「模板」高斯消元法 高斯消元
问题描述 LG3389 题解 高斯消元,是用来解\(n\)元一次方程组的算法,时间复杂度\(O(n^3)\) 这样就构造出了这个方程组的矩阵 目标就是把这个矩阵左边\(n \times n\)消为单位 ...
随机推荐
- 详解Kafka: 大数据开发最火的核心技术
详解Kafka: 大数据开发最火的核心技术 架构师技术联盟 2019-06-10 09:23:51 本文共3268个字,预计阅读需要9分钟. 广告 大数据时代来临,如果你还不知道Kafka那你就真 ...
- leetcode解题报告(7):Valid Parentheses
描述 Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the i ...
- Linux之创建多个子进程
/*** fork_test.c ***/ #include<stdio.h> #include<stdlib.h> #include<unistd.h> int ...
- Monkey测试感想
monkey测试主要做随机的黑盒测试,通过不断输入伪随机的事件流来测试应用的稳定性,但是由于monkey太过皮,太过随机,最后根本无法控制,很容易陷于一个页面无法出来,或者陷入某个无关紧要的地方无法出 ...
- Java中RuntimeException和Exception
在java的异常类体系中,Error和RuntimeException是非检查型异常,其他的都是检查型异常. 所有方法都可以在不声明throws的情况下抛出RuntimeException及其子类 不 ...
- JAVA基础知识|内部类
一.什么是内部类? 内部类(inner class)是定义在另一个类中的类 为什么使用内部类? 1)内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据 2)内部类可以对同一个包中的其他类隐藏 ...
- 感知机算法及BP神经网络
简介:感知机在1957年就已经提出,可以说是最为古老的分类方法之一了.是很多算法的鼻祖,比如说BP神经网络.虽然在今天看来它的分类模型在很多数时候泛化能力不强,但是它的原理却值得好好研究.先学好感知机 ...
- LC 984. String Without AAA or BBB
Given two integers A and B, return any string S such that: S has length A + B and contains exactly A ...
- linux:解决SSH连接Linux超时自动断开
用SSH登录到Linux的时候,由于默认的连接超时时间很短,经常断开! 1.修改文件 # vi /etc/ssh/sshd_config 2.重启sshd服务 # /etc/init.d/sshd r ...
- 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_10-修改页面-前端-修改页面
1.进入页面,通过钩子方法请求服务端获取页面信息,并赋值给数据模型对象 2.页面信息通过数据绑定在表单显示 3.用户修改信息点击“提交”请求服务端修改页面信息接口 3.3.3 修改页面 3.3.3.1 ...