UOJ197 线性规划
传送门
由于这道题标程GG了所以必不可能AC嘛2333
单纯形法是一个很玄学的东西qwq
就是 非标准型 -> 标准型 -> 规范型 -> 松弛型
一个玄学操作——转轴操作(privot)
等着学习笔记到时候再补吧先把程序放出来
写了一些注释方便理解qwq
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<ctime>
#define inf 20021225
#define ll long long
#define db double
#define eps 1e-8
using namespace std;
db ans[51],a[51][51];int id[51];int n,m,t;
void privot(int x,int y)
{
swap(id[n+x],id[y]);
// 把基变量和非基变量只交换编号
// 相当于 id[n+x] x∈(1,m) 存基变量的编号
db tmp=1.0/a[x][y];
a[x][y]=1.0;// 原先基变量系数为1
for(int i=0;i<=n;i++) a[x][i]*=tmp;
// 非基变量化基变量系数化一 类似解方程代入法之前的系数化一
for(int i=0;i<=m;i++)
{
if(i==x||abs(a[i][y])<eps) continue;
db cur=a[i][y]; a[i][y]=0.0;
for(int j=0;j<=n;j++)
a[i][j]-=a[x][j]*cur;
}
// 利用新的基变量消元
}
bool prework()
{
// 规范型线性规划要求b[i]非负 但是标准型没有这个要求 所以需要预处理
// 把所有b[i]是负的随机匹配几个a[i]是负的然后替换一下 b[i]就变成正的了
while(1)
{
int x=0,y=0,i;
for(i=1;i<=m;i++) if(a[i][0]<-eps && (!x || rand()&1)) x=i;
if(!x) return true;
for(i=1;i<=n;i++) if(a[x][i]<-eps && (!y || rand()&1)) y=i;
if(!y){printf("Infeasible\n");return false;}//只能取负数无可行域
privot(x,y);
}
return true;
}
bool simplex()
{
while(1)
{
int i,x=0,y=0; double mn=1e15;
for(i=1;i<=n;i++) if(a[0][i]>eps){y=i;break;}
// 找一个目标系数>0的
if(!y) break;
for(i=1;i<=m;i++)
if(a[i][y]>eps&&a[i][0]/a[i][y]<mn)
mn=a[i][0]/a[i][y],x=i;
// 找限制最严格的
if(!x){printf("Unbounded\n");return false;}
// 没有限制直接上天(划)无穷大
privot(x,y);
}
return true;
}
int main()
{
srand(time(0));
scanf("%d%d%d",&n,&m,&t);
for(int i=1;i<=n;i++) scanf("%lf",&a[0][i]),id[i]=i;
//初始非基变量i 基变量n+i
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++) scanf("%lf",&a[i][j]);
scanf("%lf",&a[i][0]);
}
if(prework()&&simplex())
{
printf("%.8lf\n",-a[0][0]);
if(t)
{
for(int i=1;i<=m;i++) ans[id[n+i]]=a[i][0];
for(int i=1;i<=n;i++) printf("%.8lf ",ans[i]);
}
}
return 0;
}
UOJ197 线性规划的更多相关文章
- 使用Python scipy linprog 线性规划求最大值或最小值(使用Python学习数学建模笔记)
函数格式 scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='simp ...
- java 线性规划 和lingo 比较
model:max=13*A+ 23*B; 5*A + 15*B <480 ; 4*A + 4 *B <160 ; 35* A + 20 *B <1190 ; end Variabl ...
- 对偶理论、拉格朗日对偶问题、LP线性规划对偶性质
Lagrange 对偶问题 定义其的对偶问题: Lagrange函数 考虑线性规划问题 若取集合约束D={x|x≥0},则该线性规划问题的Lagrange函数为 线性规划的对偶问题为: 对偶定理原问题 ...
- 用Microsoft.Solver.Foundation进行线性规划,为WPF应用添加智能
在管理信息系统的开发过程中,往往会涉及到一些线性规划数学模型,例如资源配置优化.微软的Microsoft.Solver.Foundation是一个数学库,可以很好的对线性规划问题进行求解.关于它的细节 ...
- 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)
写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...
- matlab绘图--线性规划图解法示意
matlab绘图--线性规划图解法示意 图解法 matlab绘图 区域填充 线性规划问题: matlab绘图 L1=[4,0;4,4]; plot(L1(:,1),L1(:,2));hold on ...
- hdu 4091 线性规划
分析转自:http://blog.csdn.net/dongdongzhang_/article/details/7955136 题意 : 背包能装体积为N, 有两种宝石, 数量无限, 不能切割. ...
- 建模算法(一)——线性规划
一.解决问题 主要是安排现有资源(一定),取得最好的效益的问题解决,而且约束条件都是线性的. 二.数学模型 1.一般数学模型 2.MATLAB数学模型 其中c,x都是列向量,A,Aeq是一个合适的矩阵 ...
- UVA 10498 Happiness(线性规划-单纯形)
Description Prof. Kaykobad has given Nasa the duty of buying some food for the ACM contestents. Nasa ...
随机推荐
- python 关于每个项目的解释器
在写程序的时候发现了一个问题,就是我原来import的第三方包,在新建的项目里仍然报错,还需要重新下载一次 发现:原来每建一个新项目,python会默认生成另一个新的解释器和相关虚拟环境,包括第三方包 ...
- js实现动态加载input 提示信息
思路:使用<datalist> 标签定义选项列表.请与 input 元素配合使用该元素,来定义 input 可能的值.datalist 及其选项不会被显示出来,它仅仅是合法的输入值列表.请 ...
- C#基础提升系列——C#异步编程
C#异步编程 关于异步的概述,这里引用MSDN的一段文字: 异步编程是一项关键技术,使得能够简单处理多个核心上的阻塞 I/O 和并发操作. 如果需要 I/O 绑定(例如从网络请求数据或访问数据库),则 ...
- .NET Core 使用 mongodb
1.运行环境 开发工具:Visual Studio 2017 JDK版本:.NET Core 2.0 项目管理工具:nuget 2.GITHUB地址 https://github.com/nbfujx ...
- Python3解leetcode Binary Tree PathsAdd DigitsMove Zeroes
问题描述: Given an array nums, write a function to move all 0's to the end of it while maintaining the r ...
- 怎么更改win7登录界面
方法/步骤 1 第一步,先打开注册表.快捷键是win+R.Win就是Windows图片那个键.打开会是这个. 2 在其中输入Regedit.就打开了传说中的注册表了.然后在注册表中选择.选择的顺序 ...
- [HDU2855]Fibonacci Check-up
题目:Fibonacci Check-up 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2855 分析: 1)二项式展开:$(x+1)^n = \sum^ ...
- SyntaxError: missing ] after element list
在前端页面js报错,找了很久没找到原因. 后来发现是后台向前端输出json字符串,而前端接收是html格式,需要将后台json字符串改成正常字符串就可以输出,或者通过ajax的方式接收json字符串.
- linux设备驱动第三篇:写一个简单的字符设备驱动
在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分 ...
- appium desktop 定位弹出框时报错
今天在定位真机APP的时候,弹出框的内容死活定位不到,只能定位到背景的内容. 问题:appium desktop 定位弹出框时报错,定位不到,只能定位到背景的内容. 分析: 定位工具找不到弹出框的元素 ...