poj1681(高斯消元)
来源:互联网 发布:testv淘宝店搜不到 编辑:程序博客网 时间:2024/05/20 06:41
题目链接:http://poj.org/problem?id=1681
题目分析:本题是有的存在自由变元的高斯消元,而且存在无解的情况,还是有一定难度的;
代码如下:
#include <set>#include <map>#include <stack>#include <queue>#include <math.h>#include <vector>#include <string>#include <utility>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>#include <functional>using namespace std;const int maxn=15*15+5;int a[maxn][maxn+1],x[maxn];//int equ,var;int free_num,ans=100000000;void Debug(){ //调试输出,看消元后的矩阵值,提交时,就不用了 int i,j; for(i=0;i<equ;i++){ for(j=0;j<var+1;j++) cout<<a[i][j]<<" "; cout<<endl; } cout<<endl;}int gcd(int a,int b) { return b==0?a:gcd(b,a%b);}int lcm(int a,int b){ return a*b/gcd(a,b);}int Gauss(){ int k,col=0; //当前处理的列 for(k=0;k<equ&&col<var;++k,++col) { int max_r=k; for(int i=k+1;i<equ;++i) if(a[i][col]>a[max_r][col]) max_r=i; if(max_r!=k){ for(int i=k;i<var+1;++i) swap(a[k][i],a[max_r][i]); } if(a[k][col]==0){ k--; continue; } for(int i=k+1;i<equ;++i) { if(a[i][col] != 0) {// int LCM=lcm(a[i][col],a[k][col]);// int ta=LCM/a[i][col],tb = LCM/a[k][col];// if(a[i][col]*a[k][col] < 0)// tb=-tb; for(int j=col;j<var+1;++j) a[i][j]^=a[k][j];//((a[i][j]*ta)%2-(a[k][j]*tb)%2+2)%2; //a[i][j]只有 0 和 1 两种状态 } } }//前面是行列式的初等行变换 //上述代码是消元的过程,行消元完成 //解下来 2 行,判断是否无解 //注意 K 的值,k 代表系数矩阵值都为 0 的那些行的第 1 行 for(int i=k;i<equ;++i) if(a[i][col]!=0)return -1; // 无解返回 -1// Debug(); //唯一解或者无穷解,k<=var //var-k==0 唯一解;var-k>0 无穷多解,自由解的个数=var-k //能执行到这,说明肯定有解了,无非是 1 个和无穷解的问题。 //下面这几行很重要,保证秩内行主元非 0,且按对角线顺序排列,就是检查列 for(int i=0;i<equ;++i)//一行主元素化为非零 if(!a[i][i]) { int j; for(j=i+1;j<var;++j) if(a[i][j]) break; if(j==var) break; for(int k=0;k<equ;++k) swap(a[k][i],a[k][j]); } // ----处理保证对角线主元非0且顺序,检查列完成 // free_num=k; int sum=0x3f3f3f3f; if (var-k>0){ for(int num=0;num<(1<<(var-k));num++){ int minn=0; memset(x,0,sizeof(x)); for(int ans=0;ans<var-k;ans++){ if((1<<ans)&num){ x[var-ans-1]=1; minn++; } }// cout<<k-1<<" "<<var-2<<endl;// cout<<x[var-2]<<" "<<x[var-1]<<endl; for(int i=k-1;i>=0;--i) //从消完元矩阵的主对角线非 0 的最后 1 行,开始往 //回带 { int tmp=a[i][var]; for(int j=i+1;j<var;++j) //x[i]取决于 x[i+1]--x[var]啊,所以后面的解对前面的解 有影响。 if(a[i][j]!=0) tmp^=x[j];//=(tmp-(a[i][j]*x[j])%2+2)%2; //if (a[i][i]==0) x[i]=tmp; //最后的空行时,即无穷解得 //else x[i]=tmp; minn+=x[i]; //上面的正常解 }// cout<<minn<<endl; sum=min(minn,sum); } //无穷多解,先枚举解,然后用下面的回带代码进行回带; //这里省略了下面的回带的代码;不管唯一解和无穷解都可以回带,只不过无穷解 //回带时,默认为最后几个自由变元=0 而已。// return; } if (var-k==0){ //唯一解时 sum=0; //下面是回带求解代码,当无穷多解时,最后几行为 0 的解默认为 0; for(int i=k-1;i>=0;--i) //从消完元矩阵的主对角线非 0 的最后 1 行,开始往 //回带 { int tmp=a[i][var]; for(int j=i+1;j<var;++j) //x[i]取决于 x[i+1]--x[var]啊,所以后面的解对前面的解 有影响。 if(a[i][j]!=0) tmp^=x[j];//=(tmp-(a[i][j]*x[j])%2+2)%2; //if (a[i][i]==0) x[i]=tmp; //最后的空行时,即无穷解得 //else x[i]=tmp; sum+=x[i]; //上面的正常解 } //回带结束了 } return sum;}int main(){ int t; scanf("%d",&t); while(t--){ int n; scanf("%d",&n); memset(a,0,sizeof(a)); memset(x,0,sizeof(x)); equ=var=n*n; char str[50]; for(int i=0;i<n;i++){ scanf("%s",str); for(int j=0;j<n;j++){ if(i-1>=0) a[i*n+j][(i-1)*n+j]=1; if(i+1<n) a[i*n+j][(i+1)*n+j]=1; if(j+1<n) a[i*n+j][i*n+j+1]=1; if(j-1>=0) a[i*n+j][i*n+j-1]=1; a[i*n+j][i*n+j]=1; if(str[j]=='w') a[i*n+j][var]=1; } }// Debug(); if(Gauss()==-1) puts("inf"); else cout<<Gauss()<<endl;// printf("PUZZLE #%d\n",cas++);// for(int i=0;i<n;i++){// for(int j=0;j<n;j++){// printf("%d ",x[i*n+j]);// }// puts("");// } } return 0;}
0 0
- poj1681 高斯消元
- poj1681(高斯消元)
- poj1681 高斯消元
- poj1681 高斯消元+dfs枚举
- poj1681
- poj1681 Painter's Problem 高斯消元
- poj1681 Painter's Problem 高斯消元
- Painter's Problem POJ1681 高斯消元
- poj1681-Painter's-Problem ( 高斯消元)
- poj1681--Painter's Problem(高斯消元问题4)
- POJ1681 Painter's Problem 高斯消元+枚举
- [POJ1681]Painter's Problem(高斯消元+dfs)
- POJ1681:Painter's Problem(高斯消元 & 格子转换 & 二进制)
- Poj1681 【枚举】
- 【POJ1681】Painter's Problem 高斯消元,求最小∑系数的异或方程组
- Painter's Problem POJ1681
- POJ1681高消+搜索
- [POJ1681]画家问题
- 二分图---匈牙利算法
- UI框架总结
- java初始化的顺序
- 最长公共子串 最长公共子序列
- 系统设计——关于数据库表设计的感悟
- poj1681(高斯消元)
- Add Two Numbers题解
- Partition Magic硬盘分区免费版
- ROS工作空间与程序包的创建
- 教你步步为营掌握自定义 View
- ios开发中最简单的tableview使用一
- Head First Design Patterns 阅读笔记之三: Decorator Pattern
- Java RESTful框架的性能比较
- js动态生成html,获取点击的监控事件写法