(模板)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\)消为单位 ...
随机推荐
- 012_STM32程序移植之_内部flash开机次数管理lib库建立
012_STM32程序移植之_内部flash开机次数管理lib库建立 1. 测试环境:STM32C8T6 2. 测试接口: 3. 串口使用串口一,波特率9600 单片机引脚------------CH ...
- 常见http响应状态码(status)
1.100-199信息响应 100 Continue: 服务器通知浏览器之前一切正常,请客户端继续请求,如果请求结束,可忽略: 101 Switching Protocal: 针对请求头的Upgrad ...
- luogu 1903 [国家集训队]数颜色 / 维护队列 带修改莫队
十分玄学的数据结构~ code: #include <bits/stdc++.h> #define N 1000006 #define setIO(s) freopen(s".i ...
- 【luogu1016】旅行家的预算--模拟
题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1D1D1.汽车油箱的容量CCC(以升为单位).每升汽油能行驶的距离D2D2D2.出发 ...
- codeforces#1234F. Yet Another Substring Reverse(子集dp)
题目链接: https://codeforces.com/contest/1234/problem/F 题意: 给出一个只包含前20个小写字母的字符串,一次操作可以让一段字符颠倒顺序 最多一次这样的操 ...
- ZR#955 折纸
ZR#955 折纸 解法: 可以发现折纸之后被折到上面的部分实际上是没有用的,因为他和下面对应位置一定是一样的,而影响答案的只有每个位置的颜色和最底层的坐标范围.因此,我们只需要考虑最底层即可,即我们 ...
- Gi命令行操作
一.本地库初始化 命令:git init 效果: 注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改 二.设置签名 形式 用户名:user Email 地址:user@1 ...
- PyTricks-使用namedtuple以及dataclass的方式定义类
from collections import namedtuple from dataclasses import dataclass # 以前简单的类可以使用namedtuple实现. Car = ...
- go区分操作系统
package main import ( "fmt" "runtime" ) func main() { fmt.Println("Go runs ...
- Flutter移动电商实战 --(35)列表页_上拉加载更多制作
右侧列表上拉加载配合类别的切换 上拉加载需要一个page参数,当点击大类或者小类的时候,这个page就要变成1 provide内定义参数 首先我们需要定义一个page的变量 下图是我们之前在首页的时候 ...