Super Moban
HAO BAN ZI 包括求解,判断无解,求自由变元个数以及标记不确定的变元。来源:http://blog.csdn.net/keshuqi/article/details/51921615
- #include<stdio.h>
- #include<algorithm>
- #include<iostream>
- #include<string.h>
- #include<math.h>
- using namespace std;
- const int MAXN=;
- int a[MAXN][MAXN];//增广矩阵
- int x[MAXN];//解集
- bool free_x[MAXN];//标记是否是不确定的变元,即自由元;
- /*
- void Debug(void)
- {
- int i, j;
- for (i = 0; i < equ; i++)
- {
- for (j = 0; j < var + 1; j++)
- {
- cout << a[i][j] << " ";
- }
- cout << endl;
- }
- cout << endl;
- }
- */
- inline int gcd(int a,int b)//非递归求最大公因数;
- {
- int t;
- while(b!=)
- {
- t=b;
- b=a%b;
- a=t;
- }
- return a;
- }
- inline int lcm(int a,int b)
- {
- return a/gcd(a,b)*b;//先除后乘防溢出,求最小公倍数;
- }
- // 高斯消元法解方程组(Gauss-Jordan elimination).(-2表示有浮点数解,但无整数解,
- //-1表示无解,0表示唯一解,大于0表示无穷解,并返回自由变元的个数)
- //有equ个方程,var个变元。增广矩阵行数为equ,分别为0到equ-1,列数为var+1,分别为0到var,最后一列为等式右边数.
- int Gauss(int equ,int var)
- {
- int i,j,k;
- int max_r;// 当前这列绝对值最大的行.
- int col;//当前处理的列collum;
- int ta,tb;
- int LCM;
- int temp;
- int free_x_num;
- int free_index;
- for(int i=;i<=var;i++)
- {
- x[i]=;
- free_x[i]=true;
- }
- //转换为阶梯阵.
- col=; // 当前处理的列
- for(k = ;k < equ && col < var;k++,col++)
- {// 枚举当前处理的行.
- // 找到该col列元素绝对值最大的那行与第k行交换.(为了在除法时减小误差)
- max_r=k;
- for(i=k+;i<equ;i++)
- {
- if(abs(a[i][col])>abs(a[max_r][col])) max_r=i;
- }
- if(max_r!=k)
- {// 与第k行交换.
- for(j=k;j<var+;j++) swap(a[k][j],a[max_r][j]);
- }
- if(a[k][col]==)
- {// 说明该col列第k行以下全是0了,则处理当前行的下一列.
- k--;
- continue;
- }
- for(i=k+;i<equ;i++)
- {// 枚举要删去的行.
- if(a[i][col]!=)
- {
- 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]<)tb=-tb;//异号的情况是相加
- for(j=col;j<var+;j++)
- {
- a[i][j] = a[i][j]*ta-a[k][j]*tb;
- }
- }
- }
- }
- // Debug();
- // 1. 无解的情况: 化简的增广阵中存在(0, 0, ..., a)这样的行(a != 0).
- for (i = k; i < equ; i++)
- { // 对于无穷解来说,如果要判断哪些是自由变元,那么初等行变换中的交换就会影响,则要记录交换.
- if (a[i][col] != ) return -;
- }
- // 2. 无穷解的情况: 在var * (var + 1)的增广阵中出现(0, 0, ..., 0)这样的行,即说明没有形成严格的上三角阵.
- // 且出现的行数即为自由变元的个数.
- if (k < var)
- {
- // 首先,自由变元有var - k个,即不确定的变元至少有var - k个.
- for (i = k - ; i >= ; i--)
- {
- // 第i行一定不会是(0, 0, ..., 0)的情况,因为这样的行是在第k行到第equ行.
- // 同样,第i行一定不会是(0, 0, ..., a), a != 0的情况,这样的无解的.
- free_x_num = ; // 用于判断该行中的不确定的变元的个数,如果超过1个,则无法求解,它们仍然为不确定的变元.
- for (j = ; j < var; j++)
- {
- if (a[i][j] != && free_x[j]) free_x_num++, free_index = j;
- }
- if (free_x_num > ) continue; // 无法求解出确定的变元.
- // 说明就只有一个不确定的变元free_index,那么可以求解出该变元,且该变元是确定的.
- temp = a[i][var];
- for (j = ; j < var; j++)
- {
- if (a[i][j] != && j != free_index) temp -= a[i][j] * x[j];
- }
- x[free_index] = temp / a[i][free_index]; // 求出该变元.
- free_x[free_index] = ; // 该变元是确定的.
- }
- return var - k; // 自由变元有var - k个.
- }
- // 3. 唯一解的情况: 在var * (var + 1)的增广阵中形成严格的上三角阵.
- // 计算出Xn-1, Xn-2 ... X0.
- for (i = var - ; i >= ; i--)
- {
- temp = a[i][var];
- for (j = i + ; j < var; j++)
- {
- if (a[i][j] != ) temp -= a[i][j] * x[j];
- }
- if (temp % a[i][i] != ) return -; // 说明有浮点数解,但无整数解.
- x[i] = temp / a[i][i];
- }
- return ;
- }
- int main(void)
- {
- freopen("in.txt", "r", stdin);
- freopen("out.txt","w",stdout);
- int i, j;
- int equ,var;
- while (scanf("%d %d", &equ, &var) != EOF)
- {
- memset(a, , sizeof(a));
- for (i = ; i < equ; i++)
- {
- for (j = ; j < var + ; j++)
- {
- scanf("%d", &a[i][j]);
- }
- }
- // Debug();
- int free_num = Gauss(equ,var);
- if (free_num == -) printf("无解!\n");
- else if (free_num == -) printf("有浮点数解,无整数解!\n");
- else if (free_num > )
- {
- printf("无穷多解! 自由变元个数为%d\n", free_num);
- for (i = ; i < var; i++)
- {
- if (free_x[i]) printf("x%d 是不确定的\n", i + );
- else printf("x%d: %d\n", i + , x[i]);
- }
- }
- else
- {
- for (i = ; i < var; i++)
- {
- printf("x%d: %d\n", i + , x[i]);
- }
- }
- printf("\n");
- }
- return ;
- }
Super Moban的更多相关文章
- 子类继承父类时JVM报出Error:Implicit super constructor People() is undefined for default constructor. Must define an explicit constructor
当子类继承父类的时候,若父类没有定义带参的构造方法,则子类可以继承父类的默认构造方法 当父类中定义了带参的构造方法,子类必须显式的调用父类的构造方法 若此时,子类还想调用父类的默认构造方法,必须在父类 ...
- [LeetCode] Super Ugly Number 超级丑陋数
Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose all ...
- Maven Super POM
Maven super POM defines some properties. Three ways to find it ${M2_HOME}/lib/maven-model-builder-3. ...
- java基础 super 子类调用父类
如果希望在子类中,去调用父类的构造方法,要求在子类的构造函数调用 example如下: package test; /* * 如果希望在子类中,去调用父类的构造方法,要求在子类的构造函数调用 * */ ...
- Python类中super()和__init__()的关系
Python类中super()和__init__()的关系 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(sel ...
- java方法重载(overload)、重写(override);this、super关键简介
一.方法重载: 条件:必须在一个类中,方法名称相同,参数列表不同(包括:数据类型.顺序.个数),典型案例构 造方重载. 注意:与返回值无关 二.方法重写: 条件: (1)继承某个类或实现某接口 (2 ...
- Java super关键字活用
在实际开发中我们要自定义组件,就需要继承自某个组件类,如果我们自定义的这个组件类也需要像被继承的这个组件类一样,拥有丰富的构造方法. 关键字super的作用就更加显得尤为重要了,你可以在堆砌自己自定义 ...
- 深入super,看Python如何解决钻石继承难题 【转】
原文地址 http://www.cnblogs.com/testview/p/4651198.html 1. Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通 ...
- 关于[super dealloc]
销毁一个对象时,需要重写系统的dealloc方法来释放当前类所拥有的对象,在dealloc方法中需要先释放当前类中所有的对象,然后再调用[super dealloc]释放父类中所拥有的对象.如先调用[ ...
随机推荐
- php将html页面截图并保存成图片
采用html5的canvas,将图片绘制到画布上,然后用canvas的 toDataURL 方法. 但是在图片转base64的过程中遇到了两个问题, 1:图片无法绘制,转成的base64 用浏览器打开 ...
- Laravel -- 模型
模型文件 <?php namespace App; use Illuminate\Database\Eloquent\Model; class Student extends Model { / ...
- 阻塞队列之LinkedBlockingQueue
概述 LinkedBlockingQueue内部由单链表实现,只能从head取元素,从tail添加元素.添加元素和获取元素都有独立的锁,也就是说LinkedBlockingQueue是读写分离的,读写 ...
- 网站mysql防止sql注入攻击 3种方法总结
mysql数据库一直以来都遭受到sql注入攻击的影响,很多网站,包括目前的PC端以及手机端都在使用php+mysql数据库这种架构,大多数网站受到的攻击都是与sql注入攻击有关,那么mysql数据库如 ...
- class实现Stack
基于class实现一个存储string类型的Stack 头文件: //stack.h #include<vector> #include<string> class Stack ...
- [ACM] POJ 2409 Let it Bead (Polya计数)
参考:https://blog.csdn.net/sr_19930829/article/details/38108871 #include <iostream> #include < ...
- 最新cloudera大数据培训班 ccah ccdh 数据分析师 数据科学家
上海2月21-24日Cloudera Developer training for Spark and Hadoop(CCA-175)北京2月23-26日Cloudera Developer tr ...
- echarts的pie图中,各区块颜色的调整
今天在学习使用echarts生成各种图表. 然后在使用pie图时出现我无论怎么更改代码中的颜色,pie图中各块的颜色都十分相近,几乎没法区别块与块之间的区别,如下图: 在下图中,除了其中一块的是红色的 ...
- 洛谷P1364 医院设置
LITTLESUN的第一道图论,撒花~~ 题目链接 这道题是Floyd的板子题 注意对于矩阵图的初始值赋值要全部赋值成最大值 十六进制的最大值表示方式是0x3f3f3f3f memset(G,0x3f ...
- Hibernate-ORM:16.Hibernate中的二级缓存Ehcache的配置
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲述Hibernate中的二级缓存的配置,作者将使用的是ehcache缓存 一,目录 1.二级缓存的具 ...