poj 3185 The Water Bowls(高斯消元)
来源:互联网 发布:福建广播网络电视台 编辑:程序博客网 时间:2024/06/05 01:57
每按一个位置,是一个状态,就是一个列向量,构造系数矩阵,上板子。。
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;//对2取模的01方程组const int MAXN = 300;//有equ个方程, var个变元。增广矩阵行数为equ,列数为var+1,分别为0到varint equ,var,n;int a[MAXN][MAXN]; //增广矩阵int x[MAXN]; //解集int free_x[MAXN];//用来存储自由变元(多解枚举自由变元可以使用)int free_num;//自由变元的个数//返回值为-1表示无解,为0是唯一解,否则返回自由变元个数int Gauss(){ int max_r,col,k; free_num = 0; for(k = 0, col = 0 ; k < equ && col < var ; k++, col++) { max_r = k; for(int i = k+1; i < equ; i++) { if(abs(a[i][col]) > abs(a[max_r][col])) max_r = i; } if(a[max_r][col] == 0) { k--; free_x[free_num++] = col;//这个是自由变元 continue; } if(max_r != k) { for(int j = col; j < var+1; j++) swap(a[k][j],a[max_r][j]); } for(int i = k+1; i < equ; i++) { if(a[i][col] != 0) { for(int j = col; j < var+1; j++) a[i][j] ^= a[k][j]; } } } for(int i = k; i < equ; i++) if(a[i][col] != 0) return -1;//无解 if(k < var) return var-k;//自由变元个数//唯一解,回代 for(int i = var-1; i >= 0; i--) { x[i] = a[i][var]; for(int j = i+1; j < var; j++) x[i] ^= (a[i][j] && x[j]); } return 0;}int solve(){ int t = Gauss(); if(t == -1) return -1; else if(t == 0) { int ans = 0; for(int i = 0; i < n*n; i++) ans += x[i]; return ans; } else { //枚举自由变元 int ans = 0x3f3f3f3f; int tot = (1<<t); for(int i = 0; i < tot; i++) { int cnt = 0; for(int j = 0; j < t; j++) { if(i&(1<<j)) { x[free_x[j]] = 1; cnt++; } else x[free_x[j]] = 0; } for(int j = var-t-1; j >= 0; j--) { int idx; for(idx = j; idx < var; idx++) if(a[j][idx]) break; x[idx] = a[j][var]; for(int l = idx+1; l < var; l++) if(a[j][l]) x[idx] ^= x[l]; cnt += x[idx]; } ans = min(ans,cnt); } return ans; }}void init(){ memset(a,0,sizeof(a)); memset(x,0,sizeof(x)); equ = n; var = n; for(int i = 0; i < n; ++i) { a[i][i] = 1; if(i > 0) a[i][i-1] = 1; if(i+1 < n) a[i][i+1] = 1; }}int main(){ n = 20; init(); for(int i = 0; i < n; i++) scanf("%d",&a[i][n]); int res = solve(); printf("%d\n",res); return 0;}
阅读全文
0 0
- poj -- 3185 The Water Bowls(高斯消元)
- poj 3185 The Water Bowls(高斯消元)
- POJ 3185 The Water Bowls(高斯消元)
- poj 3185 The Water Bowls(高斯消元)
- poj 3185 The Water Bowls 高斯消元
- poj 3185 The Water Bowls(高斯消元)
- POJ 3185 The Water Bowls(高斯消元)
- poj 3185 The Water Bowls (高斯消元)
- POJ 3185 The Water Bowls (高斯消元)
- poj 3185 The Water Bowls(数学:高斯消元)
- poj 3185 The Water Bowls(高斯消元 开关问题)
- poj 3185 The Water Bowls
- POJ 3185 (The Water Bowls)
- POJ 3185 The Water Bowls
- poj 3185 The Water Bowls
- POJ 3185 The Water Bowls
- POJ 3185 The Water Bowls
- POJ-3185-The Water Bowls
- nyoj43 24 Point game(搜索)
- 深度剖析函数的调用过程
- docker容器带我入坑
- RFC2818--HTTPS/TLS 翻译
- 动态规划之0-1背包问题
- poj 3185 The Water Bowls(高斯消元)
- 《离散数学》备考复习
- varnish 基础应用
- mysql分库分表在什么时候用?如何用?
- 安卓扫描车牌识别的功能SDK
- 【软考】-防火墙
- Distances to Zero
- 【ZJOJ 5454】【NOIP2017提高A组冲刺11.5】仔细的检查
- 并发编程(11)-Future模式