题目链接

  这写得还不错:http://www.cnblogs.com/zzqsblog/p/5457091.html

  引入基变量\(x_{i+n}\),将约束\(\sum_{i=1}^m a_{ij}x_j\leq b_i\)改写为$$x_{i+n}=b_i-\sum_{i=1}^m a_{ij}x_j$$。

  目标函数为\(\sum_{i=1}^n C_ix_i\)。当存在\(r,c\)满足\(C_c>0\),\(B_r>0\),\(a_{rc}>0\),对第\(r\)个限制中的\(x_c\)做代换,即$$x_c=B_r-\sum_{j!=c}a_{rj}x_j-x_{r+n}$$(\(x_c\)成为基变量,\(x_{r+n}\)成为非基变量),然后代入目标函数中,非基变量取0,就一定可以使目标函数增大。这一步通过\(Pivot(r,c)\)(转轴)实现,同时要把其它约束中的\(x_c\)替换掉。

  当所有\(B_r\geq 0\)时,所有非基变量取0可以得到一个基本解(零解),即一定存在解。若存在\(B_r<0\),在限制\(r\)中找一个\(a_{rc}<0\)的\(x_c\)做代换,就可以使\(B_r>0\)。

  当然前提是任意\(x_i>0,i\in [1,n+m]\)。

//0ms	520kb
#include <cmath>
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define eps 1e-8
const int N=25;
const double INF=1e9; int n,m,id[50];
double A[N][N],Ans[N]; inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=='-'&&(f=-1),c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
void Pivot(int r,int c)//r:Basic varivle c:Nonbasic variable
{//交换基变量与非基变量
std::swap(id[r+n],id[c]);
double t=A[r][c]; A[r][c]=1;//
for(int i=0; i<=n; ++i) A[r][i]/=t;
for(int i=0; i<=m; ++i)//在其它等式中换掉基变量
if(fabs(A[i][c])>eps && i!=r)
{
t=A[i][c]; A[i][c]=0;//
for(int j=0; j<=n; ++j) A[i][j]-=t*A[r][j];
}
}
bool Init()
{
for(int r,c; ; )
{
r=c=0;
for(int i=1; i<=m; ++i)//B[r]<0
if(A[i][0]<-eps && (!r || rand()&1)) r=i;
if(!r) return 1;
for(int i=1; i<=n; ++i)//A[r][c]<0
if(A[r][i]<-eps && (!c || rand()&1)) c=i;
if(!c) return puts("Infeasible"),0;
Pivot(r,c);
}
}
bool Simplex()
{
for(int r,c; ; )
{
r=c=0;
for(int i=1; i<=n; ++i)//C[c]>0
if(A[0][i]>eps) {c=i; break;}
if(!c) return 1;
double mn=INF;//找一个系数为正且约束最紧的A[r][c]
for(int i=1; i<=m; ++i)
if(A[i][c]>eps && A[i][0]/A[i][c]<mn) r=i, mn=A[i][0]/A[i][c];
if(!r) return puts("Unbounded"),0;//无约束
Pivot(r,c);
}
} int main()//x[i+n]=B[i]-∑a[i][j]*x[j]
{
srand(20180724);
n=read(), m=read(); int type=read();
for(int i=1; i<=n; ++i) A[0][i]=read();//目标函数系数C[i]
for(int i=1; i<=m; ++i)
{
for(int j=1; j<=n; ++j) A[i][j]=read();
A[i][0]=read();//B[i]
}
for(int i=1; i<=n; ++i) id[i]=i;
if(Init() && Simplex())
{
printf("%.8lf\n",-A[0][0]);//代换的时候Bi系数是负的s
if(type)
{
for(int i=1; i<=m; ++i) Ans[id[i+n]]=A[i][0];//成为基变量的xi取值即为bi,非基变量上的xi取0.
for(int i=1; i<=n; ++i) printf("%.8lf ",Ans[i]);
}
} return 0;
}

UOJ.179.线性规划(单纯形)的更多相关文章

  1. UOJ#179. 线性规划[模板]

    传送门 http://uoj.ac/problem/179 震惊,博主竟然还不会线性规划! 单纯形实在学不会啊……背个板子当黑盒用…… 学(chao)了NanoApe dalao的板子 #includ ...

  2. UOJ#179. 线性规划(线性规划)

    描述 提交 自定义测试 这是一道模板题. (这个题现在标程挂了..哪位哥哥愿意提供一下靠谱的标程呀?) 本题中你需要求解一个标准型线性规划: 有 nn 个实数变量 x1,x2,…,xnx1,x2,…, ...

  3. uoj#179 线性规划

    这是一道模板题. 本题中你需要求解一个标准型线性规划: 有nn个实数变量x1,x2,⋯,xnx1,x2,⋯,xn和mm条约束,其中第ii条约束形如∑nj=1aijxj≤bi∑j=1naijxj≤bi. ...

  4. 【UOJ #179】线性规划 单纯形模板

    http://uoj.ac/problem/179 终于写出来了单纯性算法的板子,抄的网上大爷的qwq 辅助线性规划找非基变量时要加个随机化才能A,我也不知道为什么,卡精度吗? 2017-3-6UPD ...

  5. 【UOJ#179】线性规划 单纯形

    题目链接: http://uoj.ac/problem/179 Solution 就是单纯形模板题,这篇博客就是存一下板子. Code #include<iostream> #includ ...

  6. 【UOJ 179】 #179. 线性规划 (单纯形法)

    http://uoj.ac/problem/179 补充那一列修改方法: 对于第i行: $$xi=bi-\sum Aij*xj$$    $$=bi-\sum_{j!=e} Aij*xj-Aie*xe ...

  7. UVA 10498 Happiness(线性规划-单纯形)

    Description Prof. Kaykobad has given Nasa the duty of buying some food for the ACM contestents. Nasa ...

  8. Note -「线性规划」学习笔记

    \(\mathcal{Definition}\)   线性规划(Linear Programming, LP)形式上是对如下问题的描述: \[\operatorname{maximize}~~~~z= ...

  9. 线性规划VB求解

    线性规划VB求解 Rem 定义动态数组 Dim a() As Single, c() As Single, b() As Single, cb() As Single Dim aa() As Sing ...

随机推荐

  1. javascript函数以及作用域简介

    javascript函数以及作用域简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.基本函数 对于JavaScript中函数参数,实际参数的个数可能小于形式参数的个数,函数内 ...

  2. Java日期比较

    在进行业务处理时,遇到一个需要比较日期但是不包含时分秒的判断问题 SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); ...

  3. jdk1.8.0_45源码解读——Map接口和AbstractMap抽象类的实现

    jdk1.8.0_45源码解读——Map接口和AbstractMap抽象类的实现 一. Map架构 如上图:(01) Map 是映射接口,Map中存储的内容是键值对(key-value).(02) A ...

  4. 矩阵乘法优化DP

    本文讲一下一些基本的矩阵优化DP的方法技巧. 定义三个矩阵A,B,C,其中行和列分别为$m\times n,n \times p,m\times p$,(其中行是从上往下数的,列是从左往右数的) $C ...

  5. 由于找不到MSVCP20.dll,无法继续执行代码

    系统:win10 专业版,刚升级win10没几天 mysql 5.7.21 解压安装,初始化时报错,错误如图: 一.查找错误原因 参考:MySQL安装使用遇到的问题, 找到微软中文官方网站,搜索 ms ...

  6. FFT(Rock Paper Scissors Gym - 101667H)

    题目链接:https://vjudge.net/problem/Gym-101667H 题目大意:首先给你两个字符串,R代表石头,P代表布,S代表剪刀,第一个字符串代表第一个人每一次出的类型,第二个字 ...

  7. Java NIO 之 Buffer(缓冲区)

    一 Buffer(缓冲区)介绍 Java NIO Buffers用于和NIO Channel交互. 我们从Channel中读取数据到buffers里,从Buffer把数据写入到Channels. Bu ...

  8. Virut.ce-感染型病毒分析报告

    1.样本概况 病毒名称 Virus.Win32.Virut.ce MD5 6A500B42FC27CC5546079138370C492F 文件大小 131 KB (134,144 字节) 壳信息 无 ...

  9. Linux内核入门(六)—— __attribute__ 机制【转】

    转自:https://blog.csdn.net/yunsongice/article/details/5538020 GNU C的一大特色(却不被初学者所知)就是__attribute__机制.__ ...

  10. contos 7创建阿里云镜像源

    今天在ESC上安装mariaDB,发现centOS 7默认的yum源上的mariaDB版本过低,然后又镜像到网易上,发现网易源上没有mariaDB,几经折腾才发现阿里镜像上mariaDB版本较新.更改 ...