POJ 1830 开关问题 高斯消元
题意:给你N个开关,其中某些开关之间是相互影响的,即一个开关控制多个,那么每个开关操作与否为一个变元,有N个变元,开关之间相互影响的系数设为1,否则为0,对模2高斯消元求解自由变元个数。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=30;
int n,m;//有n个方程,m个未知数
int a[maxn][maxn];
int x[maxn];//解集
bool free_x[maxn];//判断是否为自由变元
int free_num;//记录自由变元的个数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);
}//返回-2表示有浮点数解,但无整数解;返回-1表示无解;返回fjfj0表示有唯一解;返回1表示有无穷个解
int gauss()
{int i,j,k;int max_r;//当前这列绝对值最大的行int col;//当前处理的列int ta,tb;int LCM;int temp;int free_x_num;int free_index;col=0;for(k=0;k<n&&col<m;k++,col++){//枚举当前处理的行max_r=k;for(i=k+1;i<n;i++){if(abs(a[i][col])>abs(a[max_r][col])) max_r=i;}if(max_r!=k){//与第k行交换for(j=k;j<m+1;j++) swap(a[k][j],a[max_r][j]);}if(a[k][col]==0){//说明该col列第k行以下全都是0了,则处理当前行的下一列k--;continue;}for(i=k+1;i<n;i++){//枚举要删去的行if(a[i][col]!=0){LCM=lcm(abs(a[i][col]),abs(a[k][col]));ta=LCM/abs(a[i][col]),tb=LCM/abs(a[k][col]);if(a[i][col]*a[k][col]<0) ta=-tb;//异号的情况是两个数相加for(j=col;j<m+1;j++){a[i][j]=((a[i][j]*ta)%2-(a[k][j]*tb)%2+2)%2;}}}}for(i=k;i<n;i++){if(a[i][col]!=0) return -1;}if(k<m){for(i=k-1;i>=0;i--){free_x_num=0;for(j=0;j<m;j++){if(a[i][j]!=0&&free_x[j]) free_x_num++,free_index=j;}if(free_x_num>1) continue;temp=a[i][m];for(j=0;j<m;j++){if(a[i][j]!=0&&j!=free_index) temp-=a[i][j]*x[j];}x[free_index]=temp/a[i][free_index];free_x[free_index]=0;}return m-k;//自由变元有m-k个}for(i=m-1;i>=0;i--){temp=a[i][m];for(j=i+1;j<m;j++){if(a[i][j]!=0) temp-=a[i][j]*x[j];}if(temp%a[i][i]!=0) return -2;x[i]=temp/a[i][i];}return 0;
}int c[maxn],t[maxn];int main()
{int k,x,y;scanf("%d",&k);while(k--){memset(a,0,sizeof a);memset(free_x,1,sizeof free_x);scanf("%d",&m);n=m;for(int i=0;i<m;i++) a[i][i]=1;for(int i=0;i<m;i++) scanf("%d",&c[i]);for(int i=0;i<m;i++) scanf("%d",&t[i]);while(scanf("%d%d",&x,&y)){if(x==0&&y==0) break;a[y-1][x-1]=1;}for(int i=0;i<n;i++){a[i][m]=(t[i]-c[i]+2)%2;}free_num=gauss();//cout<<"自由变元个数:"<<free_num<<endl;if(free_num==-1||free_num==-2) puts("Oh,it's impossible~!!");else printf("%d\n",(1<<free_num));}return 0;
}
POJ 1830 开关问题 高斯消元相关推荐
- poj 1830 开关问题 高斯消元
题目链接 高斯消元模板, 判断是否有解以及变元的数量. 1 #include <iostream> 2 #include <vector> 3 #include <cst ...
- POJ 1753 Flip Game 高斯消元
和1222,1681差不多 POJ 1222 高斯消元更稳 POJ 1681 高斯消元 枚举自由变元 equ = 16 ,var = 16的方程组 #include <cstdio> #i ...
- POJ 2947 Widget Factory (高斯消元解同余方程组)
题意:N种物品,M条记录,接写来M行,每行有K,str1,str2,表示第i个记录从星期str1到星期str2,做了K件物品,接下来的K个数为物品的编号.求做每个物品所需的时间,并且最后结果在3-9之 ...
- poj 1753 Flip Game 高斯消元 异或方程组 求最值
题目链接:http://poj.org/problem?id=1753 题意:给出一张4*4的图,表示16个方格的初始颜色的情况(白或黑),相邻方格操作的时候会相互影响,求最少的操作次数,使得每个方格 ...
- 开关问题 POJ - 1830 高斯消元
开关问题 POJ - 1830 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变 ...
- POJ 1830 开关问题 【01矩阵 高斯消元】
任意门:http://poj.org/problem?id=1830 开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 1 ...
- POJ 1222 1681 1830 3185 开关灯问题 (高斯消元 异或方程组)
POJ 1222 EXTENDED LIGHTS OUT 基本的开关灯问题.还保证唯一解. 我们把每一个灯泡当成一个状态xi,总共有30个,而且每个灯与其他灯的关系也很明显.所以我们就可以列30方程3 ...
- pku 1830 开关问题(构造矩阵+高斯消元)
开关问题 Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 4653 Accepted: 1675 Description ...
- poj 1830 高斯消元
终于会一点高斯消元了,认真学还是学的进去啊...... 搞明白解异或方程的原理,然后构造出矩阵就好做了.模板题 1 #include <cstdio> 2 #include <cst ...
最新文章
- squid在企业网中的应用
- HttpWebResponse 的问题
- loadrunner中并发数与迭代的区别
- 【英语学习】【医学】Unit 01 The Skeletal System
- Redis学习---(7)Redis 字符串(String)
- 热榜第一!GitHub 标星 5.6w,用 Python 实现所有算法!
- celery4+django2定时任务
- Java中关于参数的讲解_解读Java参数传递
- 把url地址复制到粘贴板上_写个简单的python爬虫爬取堆糖上漂亮的小姐姐
- 切图崽的自我修养-[ES6] 编程风格规范
- java 异常总结_Java异常的十大问题总结
- 给扔物线 HenCoder Plus 学员的一次分享文字版
- 公司企业邮箱IP被列入国际黑名单组织怎么解决
- 苹果x和xs买哪个好_苹果12和12pro哪个值得买_苹果12和12pro哪个好
- 28 | 机器学习:如何教会机器识别黑灰产?
- html中阳历生日转换成农历,公历转农历生日查询器,公历农历换算器?
- Cheat Engine(CE)-----下载安装及入门
- Snowy小诺 前端关闭Eslint校验 yarn
- 发现了吗?西部世界III在Broadway上的广告
- 【重磅】DeepMind开源史上最全强化学习框架OpenSpiel(附安装方法)