UOJ#179. 线性规划(线性规划)
这是一道模板题。
(这个题现在标程挂了。。哪位哥哥愿意提供一下靠谱的标程呀?)
本题中你需要求解一个标准型线性规划:
有 nn 个实数变量 x1,x2,…,xnx1,x2,…,xn 和 mm 条约束,其中第 ii 条约束形如 ∑nj=1aijxj≤bi∑j=1naijxj≤bi。
此外这 nn 个变量需要满足非负性限制,即 xj≥0xj≥0。
在满足上述所有条件的情况下,你需要指定每个变量 xjxj 的取值,使得目标函数 F=∑nj=1cjxjF=∑j=1ncjxj 的值最大。
输入格式
第一行三个正整数 n,m,tn,m,t。其中 t∈{0,1}t∈{0,1}。
第二行有 nn 个整数 c1,c2,⋯,cnc1,c2,⋯,cn,整数间均用一个空格分隔。
接下来 mm 行,每行代表一条约束,其中第 ii 行有 n+1n+1 个整数 ai1,ai2,⋯,ain,biai1,ai2,⋯,ain,bi,整数间均用一个空格分隔。
输出格式
如果不存在满足所有约束的解,仅输出一行 "Infeasible"。
如果对于任意的 MM,都存在一组解使得目标函数的值大于 MM,仅输出一行"Unbounded"。
否则,第一行输出一个实数,表示目标函数的最大值 FF。当第一行与标准答案的相对误差或绝对误差不超过 10−610−6,你的答案被判为正确。
如果 t=1t=1,那么你还需要输出第二行,用空格隔开的 nn 个非负实数,表示此时 x1,x2,…,xnx1,x2,…,xn 的取值,如有多组方案请任意输出其中一个。
判断第二行是否合法时,我们首先检验 F−∑nj=1cjxjF−∑j=1ncjxj 是否为 00,再对于所有 ii,检验 min{0,bi−∑nj=1aijxj}min{0,bi−∑j=1naijxj} 是否为 00。检验时我们会将其中大于 00 的项和不大于 00 的项的绝对值分别相加得到 S+S+ 和 S−S−,如果 S+S+ 和 S−S− 的相对误差或绝对误差不超过 10−610−6,则判为正确。
如果 t=0t=0,或者出现 Infeasible 或 Unbounded 时,不需要输出第二行。
样例一
input
2 2 1
1 1
2 1 6
-1 2 3
output
4.2
1.8 2.4
explanation
两条约束分别为 2x1+x2≤6,−x1+2x2≤32x1+x2≤6,−x1+2x2≤3。
当 x1=1.8,x2=2.4x1=1.8,x2=2.4 时目标函数 x1+x2x1+x2 取到最大值 4.24.2。
样例二
input
2 2 1
1 -1
1 1 4
-1 -2 -2
output
4.0
4.0 0.0
explanation
注意 xj≥0xj≥0 的限制。
样例三
input
3 3 1
0 0 1
-2 1 0 -4
1 1 0 4
1 -2 0 -4
output
Infeasible
样例四
input
2 1 1
0 1
1 0 1
output
Unbounded
限制与约定
对于所有数据,1≤n,m≤201≤n,m≤20,0≤|aij|,|bi|,|cj|≤1000≤|aij|,|bi|,|cj|≤100,t∈{0,1}t∈{0,1}。
本题包含 4 个子任务,每个 25 分。
子任务 1,3 满足 bi≥0bi≥0。
子任务 2,4 没有特殊限制。
子任务 1,2 中 t=0t=0。
子任务 3,4 中 t=1t=1。
时间限制:1s1s
空间限制:256MB256MB
下载
线性规划貌似在必修五有啊qwq不过还没学到估计也不会讲单纯形算法吧
感觉线性规划是差分约束的升级版??
如果想学的话建议看2016年队爷的论文《浅谈线性规划在信息学竞赛中的应用》
不过为啥A不了啊
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN = , INF = 1e9 + ;
const double eps = 1e-;
inline int read() {
char c = getchar();int x = ,f = ;
while(c < '' || c > ''){if(c == '-')f = -;c = getchar();}
while(c >= '' && c <= ''){x = x * + c - '',c = getchar();}
return x * f;
}
int N, M, opt;
int id[MAXN];
double ans[MAXN], a[MAXN][MAXN];
void Pivot(int l, int e) {
swap(id[N + l], id[e]);
double t = a[l][e]; a[l][e] = ;
for(int i = ; i <= N; i++) a[l][i] /= t;//交换基变量与非基变量
for(int i = ; i <= M; i++) {
if(i != l && abs(a[i][e]) > eps) {
t = a[i][e]; a[i][e] = ;//t表示系数
for(int j = ; j <= N; j++)
a[i][j] -= a[l][j] * t;//消去需要消去的非基变量
}
}//带入的过程就是消去非基变量
}
bool init() {
//寻找初始化解,若bi < 0,找到一个ai < 0,转换它们,不断重复直到所有的bi都 > 0
//此时x1 = 0, x2 = 0···就是一组解
while() {
int l = , e = ;
for(int i = ; i <= M; i++) if(a[i][] < -eps && (!l || (rand() & ))) l = i;
if(!l) break;
for(int i = ; i <= N; i++) if(a[l][i] < -eps && (!e || (rand() & ))) e = i;
if(!e) {puts("Infeasible"); return ;}
//这里所有的Xi都是正的,而bi是负的,这与松弛型相矛盾
Pivot(l, e);
}
return ;
}
bool simplex() {
while() {
int l = , e = ; double mn = INF;
for(int i = ; i <= N; i++)
if(a[][i] > eps)
{e = i; break;}
if(!e) break;
for(int i = ; i <= M; i++)
if(a[i][e] > eps && a[i][] / a[i][e] < mn)
mn = a[i][] / a[i][e], l = i;//找到下界最紧的松弛
if(!l) {puts("Unbounded"); return ;}
Pivot(l, e);
}
return ;
}
int main() {
srand();
N = read(); M = read(); opt = read();
for(int i = ; i <= N; i++) a[][i] = read();//最大化C1X1 + C2X2···
for(int i = ; i <= M; i++) {
for(int j = ; j <= N; j++)
a[i][j] = read();
a[i][] = read();// <= b
}
for(int i = ; i <= N; i++) id[i] = i;
if(init() && simplex()) {
printf("%.8lf\n", -a[][]);
if(opt) {
for(int i = ; i <= M; i++) ans[id[i + N]] = a[i][];//tag
for(int i = ; i <= N; i++) printf("%.8lf ", ans[i]);
}
}
return ;
}
/*
3 3 1
3 1 2
1 1 3 30
2 2 5 24
4 1 2 36
*/
UOJ#179. 线性规划(线性规划)的更多相关文章
- 【UOJ #179】线性规划 单纯形模板
http://uoj.ac/problem/179 终于写出来了单纯性算法的板子,抄的网上大爷的qwq 辅助线性规划找非基变量时要加个随机化才能A,我也不知道为什么,卡精度吗? 2017-3-6UPD ...
- 【UOJ#179】线性规划 单纯形
题目链接: http://uoj.ac/problem/179 Solution 就是单纯形模板题,这篇博客就是存一下板子. Code #include<iostream> #includ ...
- UOJ#179. 线性规划[模板]
传送门 http://uoj.ac/problem/179 震惊,博主竟然还不会线性规划! 单纯形实在学不会啊……背个板子当黑盒用…… 学(chao)了NanoApe dalao的板子 #includ ...
- uoj#179 线性规划
这是一道模板题. 本题中你需要求解一个标准型线性规划: 有nn个实数变量x1,x2,⋯,xnx1,x2,⋯,xn和mm条约束,其中第ii条约束形如∑nj=1aijxj≤bi∑j=1naijxj≤bi. ...
- 【UOJ 179】 #179. 线性规划 (单纯形法)
http://uoj.ac/problem/179 补充那一列修改方法: 对于第i行: $$xi=bi-\sum Aij*xj$$ $$=bi-\sum_{j!=e} Aij*xj-Aie*xe ...
- UOJ.179.线性规划(单纯形)
题目链接 这写得还不错:http://www.cnblogs.com/zzqsblog/p/5457091.html 引入基变量\(x_{i+n}\),将约束\(\sum_{i=1}^m a_{ij} ...
- Note -「线性规划」学习笔记
\(\mathcal{Definition}\) 线性规划(Linear Programming, LP)形式上是对如下问题的描述: \[\operatorname{maximize}~~~~z= ...
- Matlab线性规划
线性规划 线性规划的标准形式 \[\underset{x}{min}{\ c^Tx}\ s.t.\ Ax \leqslant b\] 例如,线性规划为: \[ \underset{x}{min ...
- MATLAB 线性规划实例应用
线性规划 线性规划函数 功能:求解线性规划问题 语法 x = linprog(f,A,b):求解问题 min fx,约束条件为 Ax <= b x = linprog(f,A,b,Aeq,beq ...
随机推荐
- [转]Loading, Editing, and Saving a Text File in HTML5 Using Javascript
本文转自:http://thiscouldbebetter.wordpress.com/2012/12/18/loading-editing-and-saving-a-text-file-in-htm ...
- winscp介绍与使用
winscp介绍 WinSCP 是一个 Windows 环境下使用的 SSH 的开源图形化 SFTP 客户端.同时支持 SCP 协议.它的主要功能是在本地与远程计算机间安全地复制文件,并且可以直接编辑 ...
- Jersey实现文件上传下载
一 文件上传 使用ajaxFileUpload进行文件上传的前端处理.在ajaxFileupload.js中,针对服务端返回的类型增加text判断, //ajax文件上传 function ajaxF ...
- HIbernate基于外键的查询
此文以个人开发记录为目的,笔拙勿喷 项目是背景是公司的E签宝平台VIP频道项目进行关联账户增加后,需要做删除时的,联合查询 当前主要表结构账户表Account. CREATE TABLE `accou ...
- java题目练手
大数阶乘 题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=28 代码如下: import java.io.*; import java.ma ...
- jQuery的选项卡
jQuery的选项卡 下面请看代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- js 浮点数计算Bug
之前在写项目时候,直接对带小数点的数据进行运算,发现所得到的值并不是自己想要的. 经过一系列学习后,发现在JavaScript中,浮点数运算都是先转换成二进制,在转成二进制的时候有出现无限循环小数,故 ...
- Python常用模块(二)
一.json与pickle json与pickle模块是为了完成数据的序列化. 序列化是指把对象(变量)从内存中变成可存储或传输的过程,在Python中叫picking,在其他语言中也由其他的叫法,但 ...
- JS的函数参数传递为值传递
function setAge(i) { alert(i);//24 i = 18; alert(i);//18,i的改变不会影响外面的age }; var age = 24; setAge(age) ...
- 好用的切换滑动焦点图框架jquery.superslide
拿到学习网站:http://www.superslide2.com/