当前位置: 首页 > news >正文

异或高斯消元模板(板子整理)

板子整理

// 异或高斯消元模板
int gauss(int n)//n*n矩阵,返回0表示有唯一解,r<n表示有无穷多组解(n-r个自由元),-1表示无解
{int r, c;//分别表示行、列for (r = 0, c = 0; c < n; c++){//第一步:找出第c列中为1的任意一行int t = r;for (int i = r; i < n; i++)if (a[i][c]) { t = i; break; }if (!a[t][c]) continue;//如果所有方程的这一列都为0那么不进行操作//第二步:将这一行换至第一行(未确定方程的第一行),即第r行for (int i = c; i <= n; i++) swap(a[t][i], a[r][i]);//第三步:将这一行之后的每一行的第c列的数变成0for (int i = r + 1; i < n; i++)if (a[i][c])for (int j = c; j <= n; j++)a[i][j] ^= a[r][j];r++;//处理完当前行,进入下一行}if (r < n){for (int i = r; i < n; i++)if (a[i][n]) return -1;  // 无穷多解,但这里还是令自由元都为0,解出一组解return n-r;}for (int i = n - 1; i >= 0; i--)for (int j = i + 1; j < n; j++)a[i][n] ^= a[i][j] & a[j][n];return 0;
}

题目

以AtCoder Beginner Contest 366 G. XOR Neighbors 为例

将相邻点的限制列为一个方程作限制,

每个点非0,所以每个点占据二进制位中的一位,

钦定第i个点在第i位为1,解满足这n+1个限制条件的异或高斯消元方程

对于无穷解的情况,秩r<n,这里钦定所有自由元均为0,

第i行的主元并不一定在第i位,倒着遍历每一行,消去得到第i行的主元的解

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<int,int> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
using namespace std;const int N = 62;
int a[N][N],x[N];
int n,m,u,v;
ll b[N];
vector<int>e[N];// 异或高斯消元模板
int gauss(int n)//n*n矩阵,返回0表示有唯一解,r<n表示有无穷多组解(n-r个自由元),-1表示无解
{int r, c;//分别表示行、列for (r = 0, c = 0; c < n; c++){//第一步:找出第c列中为1的任意一行int t = r;for (int i = r; i < n; i++)if (a[i][c]) { t = i; break; }if (!a[t][c]) continue;//如果所有方程的这一列都为0那么不进行操作//第二步:将这一行换至第一行(未确定方程的第一行),即第r行for (int i = c; i <= n; i++) swap(a[t][i], a[r][i]);//第三步:将这一行之后的每一行的第c列的数变成0for (int i = r + 1; i < n; i++)if (a[i][c])for (int j = c; j <= n; j++)a[i][j] ^= a[r][j];r++;//处理完当前行,进入下一行}if (r < n){for (int i = r; i < n; i++)if (a[i][n]) return -1;  // 无穷多解,但这里还是令自由元都为0,解出一组解return n-r;}for (int i = n - 1; i >= 0; i--)for (int j = i + 1; j < n; j++)a[i][n] ^= a[i][j] & a[j][n];return 0;
}bool sol(){rep(u,0,n-1){memset(a,0,sizeof a);rep(i,0,n-1){for(auto &v:e[i]){a[i][v]=1;}}a[n][u]=a[n][n+1]=1;//钦定u为1int var=n+1;int t=gauss(var);if(t==-1)continue;//无解if(t==0 && a[n][var])continue;//无解if(t==0){rep(i,0,n-1){x[i]=a[i][var];}}else{//无穷解,这里不妨自由元全为0,倒着解出一组解//printf("t:%d\n",t);memset(x,0,sizeof x);for(int j=var-t-1;j>=0;--j){int tmp=a[j][var],tp,ok=1;for(int k=j;k<var;++k){if(!a[j][k])continue;if(ok){//找主元ok=0;tp=k;}else{ tmp^=x[k];}}x[tp]=tmp;}}rep(i,0,n-1){if(x[i]){b[i]|=(1ll<<u);}}}rep(i,0,n-1){if(!b[i])return 0;}return 1;
}int main(){sci(n);sci(m);rep(i,1,m){sci(u);sci(v);u--;v--;e[u].pb(v);e[v].pb(u);}if(!sol()){puts("No");}else{puts("Yes");rep(i,0,n-1){printf("%lld%c",b[i]," \n"[i==n-1]);}}return 0;
}

精简版

inline ll gauss() {rep(i, 1, n) {ll u = i;while(u <= L && !a[u][i]) ++u;if(u > L) return i;swap(a[i], a[u]);rep(j, 1, L) {if(i == j || !a[j][i]) continue;rep(k, 1, n + 1) a[j][k] ^= a[i][k];}}return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Leetcode 242 】有效的字母异位词——这也太简单了吧
  • .gitignore不生效的解决方案
  • resource not found with Azure OpenAI service
  • day16-测试自动化之selenium的PO模式
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • 八、MyBatis
  • 《网络编程实战系列》(17)网络桥接模式
  • 【设计模式】一文读懂策略模式
  • 【ML】Pre-trained Language Models及其各种微调模型的实现细节和特点
  • zip压缩包的格式不标准导致C++开源unzip.cpp解压失败问题的排查
  • loginApi
  • 每天五分钟深度学习pytorch:训练神经网络模型的基本步骤
  • 【竞品分析】竞品分析报告的基本模板
  • 裁剪或填充张量(Tensor)(四维与五维)(Python代码)
  • 【Python】requests的response.text 和 urllib.request 的 response.read()的区别
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【comparator, comparable】小总结
  • 【刷算法】求1+2+3+...+n
  • 07.Android之多媒体问题
  • Brief introduction of how to 'Call, Apply and Bind'
  • C语言笔记(第一章:C语言编程)
  • ES10 特性的完整指南
  • gulp 教程
  • Joomla 2.x, 3.x useful code cheatsheet
  • Linux gpio口使用方法
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • react 代码优化(一) ——事件处理
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • SQLServer之创建数据库快照
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 对象管理器(defineProperty)学习笔记
  • 工程优化暨babel升级小记
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 简单基于spring的redis配置(单机和集群模式)
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 微信小程序实战练习(仿五洲到家微信版)
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 正则表达式小结
  • ​【已解决】npm install​卡主不动的情况
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​虚拟化系列介绍(十)
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #WEB前端(HTML属性)
  • (4)(4.6) Triducer
  • (4)STL算法之比较
  • (AngularJS)Angular 控制器之间通信初探
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (十八)Flink CEP 详解
  • (四)图像的%2线性拉伸