Gauss elimination Template

Gauss elimination :

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <stdio.h>
using namespace std;const int MAXN = 50;int a[MAXN][MAXN];//增广矩阵
int x[MAXN];//解集
bool free_x[MAXN];//标记是否是不确定的变元
int free_num;void Debug(int equ, int var){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){int t;while (b != 0){t = b;b = a%b;a = t;}return a;
}
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;//当前处理的列int ta, tb;int LCM;int temp;int free_x_num;int free_index;for (int i = 0; i <= var; i++){x[i] = 0;free_x[i] = true;}//转换为阶梯阵.col = 0; // 当前处理的列for (k = 0; k < equ && col < var; k++, col++){// 枚举当前处理的行.// 找到该col列元素绝对值最大的那行与第k行交换.(为了在除法时减小误差)max_r = k;for (i = k + 1; 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 + 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 < equ; 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)tb = -tb;//异号的情况是相加for (j = col; j < var + 1; 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] != 0) return -1;}// 2. 无穷解的情况: 在var * (var + 1)的增广阵中出现(0, 0, ..., 0)这样的行,即说明没有形成严格的上三角阵.// 且出现的行数即为自由变元的个数.if (k < var){// 首先,自由变元有var - k个,即不确定的变元至少有var - k个.for (i = k - 1; i >= 0; i--){// 第i行一定不会是(0, 0, ..., 0)的情况,因为这样的行是在第k行到第equ行.// 同样,第i行一定不会是(0, 0, ..., a), a != 0的情况,这样的无解的.free_x_num = 0; // 用于判断该行中的不确定的变元的个数,如果超过1个,则无法求解,它们仍然为不确定的变元.for (j = 0; j < var; j++){if (a[i][j] != 0 && free_x[j]) free_x_num++, free_index = j;}if (free_x_num > 1) continue; // 无法求解出确定的变元.// 说明就只有一个不确定的变元free_index,那么可以求解出该变元,且该变元是确定的.temp = a[i][var];for (j = 0; j < var; 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 var - k; // 自由变元有var - k个.
    }// 3. 唯一解的情况: 在var * (var + 1)的增广阵中形成严格的上三角阵.// 计算出Xn-1, Xn-2 ... X0.for (i = var - 1; i >= 0; i--){temp = a[i][var];for (j = i + 1; j < var; 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 start[MAXN];
int endd[MAXN];int main(){int t;cin >> t;while (t--){int n;cin >> n;for (int i = 0; i < n; i++) cin >> start[i];for (int i = 0; i < n; i++) cin >> endd[i];memset(a, 0, sizeof(a));int b, c;while (cin >> b >> c && (b || c)){a[c - 1][b - 1] = 1;}for (int i = 0; i < n; i++)a[i][i] = 1;for (int i = 0; i < n; i++)a[i][n] = start[i] ^ endd[i];//Debug(n, n);free_num = Gauss(n, n);if (free_num == -1) cout << "Oh,it's impossible~!!" << endl;else cout << (1 << free_num) << endl;}
}

 

转载于:https://www.cnblogs.com/wushuaiyi/p/3874333.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不要假装努力,结果不会陪你演戏!

转载于:https://www.cnblogs.com/strive-19970713/p/11171205.html

机器学习基石作业一中的PLA和POCKET_PLA实现

前提&#xff1a;文中使用的数据是本人下载下来以后自己处理过的&#xff0c;就是把文件中的所有分隔符都换成了空格。所以load_data方法只能加载我自己的数据&#xff0c;想要加载原生数据的话需要自己写load_data方法。 两个算法的关键地方都需要判断当前的w在某个样本点x上是…

机器学习基石-作业二-第10题分析

题目如上图所示&#xff0c;答案是&#xff1a;&#xff1b;在网上看到的答案中有一个很好的解释就是说在一个n纬的欧几里德空间里&#xff0c;分别按照参数做一个垂直于每个轴的超平面&#xff0c;这些超平面能够打散这么多个点。首先我承认这个事实&#xff0c;具体的证明还没…

用CSS控制Table和div因撑开而变形

用CSS控制Table和div因撑开而变形 http://inrainight.blogbus.com/logs/50853786.html <style>table { table-layout: fixed; word-wrap:break-word; }div { word-wrap:break-word; }</style> 语法&#xff1a; word-wrap : normal | break-word 参数&#xff1…

机器学习基石作业二中的DECISION_STUMP实现

概要&#xff1a;在林老的题目描述中&#xff0c;DECISION_STUMP&#xff08;其实就是“决策桩”&#xff0c;也就是只有一层的决策树&#xff09;。题目中提到了的选去是把属性&#xff08;一维的&#xff09;按照从小到大的顺序排列以后取两个挨着的值的平均值&#xff0c;网…

【MM系列】SAP 关于更改物料的价格控制类型

公众号&#xff1a;SAP Technical本文作者&#xff1a;matinal原文出处&#xff1a;http://www.cnblogs.com/SAPmatinal/ 原文链接&#xff1a;【MM系列】SAP 关于更改物料的价格控制类型前言部分 大家可以关注我的公众号&#xff0c;公众号里的排版更好&#xff0c;阅读更舒适…

机器学习基石-作业三-第2题分析以及通过H证明EIN的讨论

题目&#xff1a; 这是机器学习基石作业三种的第二小题&#xff0c;额&#xff0c;在网上看了很多解答&#xff08;解答也不多&#xff09;感觉都没有说清楚为什么&#xff0c;所以励志清楚滴解决一下这个问题&#xff0c;经过努力&#xff0c;自认为得到了详细的解答&#xff…

Nginx的平滑升级记录---适用于编译安装的Nginx

一、查看自己的Nginx的版本号 [rootlocalhost sbin]# cd /usr/local/nginx/sbin/ [rootlocalhost sbin]# ls nginx [rootlocalhost sbin]# ./nginx -V nginx version: nginx/1.15.0 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) configure arguments: 二、确定自己要…

机器学习基石-作业三-代码部分

梯度下降迭代和牛顿迭代&#xff0c;gradient_and_newton.py # -*- coding:utf-8 -*- # Author: Evan Mi import numpy as np""" 作业三中使用梯度下降和牛顿法进行迭代 """def update(u, v, eta):u_tem u - eta * (np.exp(u) v * np.exp(u*v…

设备树中#address-cells和#size-cells作用

device tree source Example1 / {#address-cells <0x1>; // 在 root node 下使用 1 個 u32 來代表 address。#size-cells <0x0>; // 在 root node 下使用 0 個 u32 來代表 size。......memory { // memory device... reg <0x90000000>; /…

[线段树][树上差分] Jzoj P3397 雨天的尾巴

Description 深绘里一直很讨厌雨天。灼热的天气穿透了前半个夏天&#xff0c;后来一场大雨和随之而来的洪水&#xff0c;浇灭了一切。虽然深绘里家乡的小村落对洪水有着顽固的抵抗力&#xff0c;但也倒了几座老房子&#xff0c;几棵老树被连根拔起&#xff0c;以及田地里的粮食…

02(c)多元无约束优化问题-牛顿法

此部分内容接《02(a)多元无约束优化问题》&#xff01; 第二类&#xff1a;牛顿法(Newton method) \[f({{\mathbf{x}}_{k}}\mathbf{\delta })\text{ }\approx \text{ }f({{\mathbf{x}}_{k}}){{\nabla }^{T}}f({{\mathbf{x}}_{k}})\cdot \mathbf{\delta }\frac{1}{2}{{\mathbf{\…

推荐系统浅浅的例子

对于推荐系统&#xff0c;有很多的很强大的算法。这里作为练习&#xff0c;只介绍基本的协同过滤算法&#xff08;userbased&#xff09;和FM&#xff08;通过梯度下降的角度&#xff0c;还可以通过交替优化的角度来看&#xff09;。 这里的例子是在七月算法的视频中看的&#…

TPL Dataflow .Net 数据流组件,了解一下?

回顾上文 作为单体程序&#xff0c;依赖的第三方服务虽不多&#xff0c;但是2C的程序还是有不少内容可讲&#xff1b; 作为一个常规互联网系统&#xff0c;无外乎就是接受请求、处理请求&#xff0c;输出响应。 由于业务渐渐增长&#xff0c;数据处理的过程会越来越复杂和冗长&…

推荐系统实例

协同过滤与隐语义模型 在机器学习问题中&#xff0c;我们见到的数据集通常是如下的格式&#xff1a; input target ... ... &#xff0c;一个输入向量的集合以及对应的数据集合,就是我们想要去预测的值。 对于…

【转】深入理解JavaScript闭包(closure)

文章来源&#xff1a;http://www.felixwoo.com/archives/247 最近在网上查阅了不少Javascript闭包(closure)相关的资料&#xff0c;写的大多是非常的学术和专业。对于初学者来说别说理解闭包了&#xff0c;就连文字叙述都很难看懂。撰写此文的目的就是用最通俗的文字揭开Java…

从头开始建立神经网络翻译及扩展

目录翻译从头开始建立神经网络-简介导包和配置生成一个数据集实现用来展示决策边界的辅助函数Logistic Regression训练一个神经网络我们的神经网络如何进行预测学习神经网络的参数实现神经网络训练一个隐层有3个神经元的神经网络验证隐层神经元个数对神经网络的影响练习练习题解…

对比 C++ 和 Python,谈谈指针与引用

花下猫语&#xff1a;本文是学习群内 樱雨楼 小姐姐的投稿。之前已发布过她的一篇作品《当谈论迭代器时&#xff0c;我谈些什么&#xff1f;》&#xff0c;大受好评。本文依然是对比 C 与 Python&#xff0c;来探讨编程语言中极其重要的概念。祝大家读有所获&#xff0c;学有所…

《吴恩达深度学习》第一课第四周任意层的神经网络实现及BUG处理

目录一、实现1、吴恩达提供的工具函数sigmoidsigmoid求导relurelu求导2、实现代码导包和配置初始化参数前向运算计算损失后向运算更新参数组装模型3、问题及思考一、实现 1、吴恩达提供的工具函数 这几个函数这里只是展示一下&#xff0c;这是吴恩达写好的工具类&#xff0c;…