这是一道模板题。

本题中你需要求解一个标准型线性规划:

有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

空间限制:256MB

正解:线性规划模板。

看了各种博客论文,现在还不是很理解。

板子参见xlightgod学长,话说完全蒯代码真的好吗。。然而我把ctime和srand去掉了才AC。。

学长的两篇博客:

http://blog.xlightgod.com/%E3%80%90uoj179%E3%80%91%E7%BA%BF%E6%80%A7%E8%A7%84%E5%88%92/

http://blog.xlightgod.com/%E7%BA%BF%E6%80%A7%E8%A7%84%E5%88%92%E4%B8%8E%E5%8D%95%E7%BA%AF%E5%BD%A2%E6%B3%95/

 //It is made by wfj_2048~
#include <algorithm>
#include <iostream>
#include <complex>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define eps (1e-12)
#define inf (1e15)
#define il inline
#define RG register
#define double long double using namespace std; double a[][],val[],ans;
int L[],E[],b[],n,m; il int gi(){
RG int x=,q=; RG char ch=getchar(); while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar(); while (ch>='' && ch<='') x=x*+ch-,ch=getchar(); return q*x;
} il void pivot(RG int l,RG int e){
swap(L[l],E[e]); RG double k=a[l][e]; a[l][e]=;
for (RG int i=;i<=n;++i) a[l][i]/=k; RG int len=;
for (RG int i=;i<=n;++i) if (fabs(a[l][i])>eps) b[++len]=i;
for (RG int i=;i<=m;++i)
if (i!=l && fabs(a[i][e])>eps){
k=a[i][e],a[i][e]=;
for (RG int j=;j<=len;++j) a[i][b[j]]-=k*a[l][b[j]];
}
return;
} il double simplex(){
while (){
RG int l,e; for (e=;e<=n;++e) if (a[][e]>eps) break;
if (e==n+) return -a[][]; RG double tmp=inf;
for (RG int i=;i<=m;++i)
if (a[i][e]>eps && a[i][]/a[i][e]<tmp) tmp=a[i][]/a[i][e],l=i;
if (tmp==inf) return inf; pivot(l,e);
}
} il int init(){
for (RG int i=;i<=n;++i) E[i]=i;
while (){
RG int l=,e=;
for (RG int i=;i<=m;++i) if (a[i][]<-eps && (!l || (rand()&))) l=i; if (!l) return ;
for (RG int i=;i<=n;++i) if (a[l][i]<-eps && (!e || (rand()&))) e=i; if (!e) return ;
pivot(l,e);
}
} il void work(){
n=gi(),m=gi(); RG int t=gi();
for (RG int i=;i<=n;++i) scanf("%Lf",&a[][i]);
for (RG int i=;i<=m;++i){
for (RG int j=;j<=n;++j) scanf("%Lf",&a[i][j]);
scanf("%Lf",&a[i][]);
}
if (!init()){ puts("Infeasible"); return; } ans=simplex();
if (ans==inf) puts("Unbounded"); else{
printf("%0.8Lf\n",ans); if (!t) return;
for (RG int i=;i<=m;++i) val[L[i]]=a[i][];
for (RG int i=;i<=n;++i) printf("%0.8Lf ",val[i]);
}
return;
} int main(){
work();
return ;
}

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.线性规划(单纯形)

    题目链接 这写得还不错:http://www.cnblogs.com/zzqsblog/p/5457091.html 引入基变量\(x_{i+n}\),将约束\(\sum_{i=1}^m a_{ij} ...

  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. Note -「线性规划」学习笔记

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

  8. UOJ179 线性规划

    Description 这是一道模板题. 本题中你需要求解一个标准型线性规划: 有\(n\)个实数变量\(x_1,x_2,\cdots,x_n\)和\(m\)条约束,其中第\(i\)条约束形如\(\s ...

  9. 虚拟机上装uoj

    前期准备: x64 ubuntu 镜像.vmware.ss账号 注意一定要有64位镜像! ss不是必须的,不过没有的话就等着下载一晚上吧... 首先先装好ubuntu,我装的是ubuntu-16.04 ...

随机推荐

  1. servlet匹配规则和顺序

    1.  写法 ①完全匹配:以“/”开头,以字母(非“*”)结束    如:<url-pattern>/test/list.do</url-pattern> ②目录匹配:以“/” ...

  2. SQL一次查出相关类容避免长时间占用表(下)

    /* server: db: EDI */ -- 以下案例多次查询同一张表,仅有Name条件不同 --可以使用一次查出相关类容避免长时间占用表 USE EDI GO DECLARE @FileType ...

  3. Git-多人协作

    声明: 此文参考廖雪峰老师的官方网站知识总结http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017 ...

  4. mybatis基础学习2---(resultType和resultMap的用法和区别)和setting的用法

    1:resultType和resultMap两者只能有一个成立 2:resultMap可以解决复杂查询时的映射问题 3:使用 resultType使用 ------------------------ ...

  5. Linux云自动化运维第二课

    一.Linux系统结构 1.Linux是一个倒树结构.Linux中所有的东西都是文件.这些文件都在系统的顶级目录中"/","/"是根目录."/&quo ...

  6. 基于原生js的返回顶部组件,兼容主流浏览器

    基于原生js的返回顶部插件,兼容IE8及以上.FF.chrome等主流浏览器. js文件中封装了getScrollTop()和changeScrollTop()函数分别用于获取滚动条滚动的高度和修改滚 ...

  7. python服务器环境搭建(3)——参数配置

    前面我们已安装好了python服务器运行所需要的相关软件,而最重要最繁琐的就是参数配置,写这篇就踩了好多坑,花了好多时间,遇到了各种各样的问题.好了费话少说,直接进入本篇话题. PS:本人不是专业的运 ...

  8. 老李分享:webservice是什么?1

    老李分享:webservice是什么?   前言 Web Services 是 Web 应用出于和其他 Web 应用以交互数据为目的的开放式标准(XML.SOAP.HTTP 等).Web Servic ...

  9. hdu 3032 Nim or not Nim? (sg函数打表找规律)

    题意:有N堆石子,每堆有s[i]个,Alice和Bob两人轮流取石子,可以从一堆中取任意多的石子,也可以把一堆石子分成两小堆 Alice先取,问谁能获胜 思路:首先观察这道题的数据范围  1 ≤ N ...

  10. sleep()和wait()的区别 --- 快入睡了,突然想起一个知识点,搞完就睡

    自从开了博客之后,大部分是转发的,不断的ctrl+c和ctrl+v,知识是越屯越多,吸收的却很少,后来越来越懒,直接保存链接了. 我已经认识到了自己的错误,自己查询到的这些知识,以后还是会定期保存的, ...