Description

这是一道模板题。

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

有\(n\)个实数变量\(x_1,x_2,\cdots,x_n\)和\(m\)条约束,其中第\(i\)条约束形如\(\sum_{j=1}^{n}a_{ij}x_{j} \le b_{i}\)。

此外这\(n\)个变量需要满足非负性限制,即\(x_{j}≥0\)。

在满足上述所有条件的情况下,你需要指定每个变量\(x_{j}\)的取值,使得目标函数\(F=\sum^n_{j=1}c_jx_j\)的值最大。

Input

第一行三个正整数 \(n,m,t\)。其中\(t \in {0,1}\)。

第二行有\(n\)个整数\(c_1,c_2,\cdots,c_n\),整数间均用一个空格分隔。

接下来mm行,每行代表一条约束,其中第\(i\)行有\(n+1\)个整数\(a_{i1},a_{i2},\cdots,a_{in},b_{i}\),整数间均用一个空格分隔。

Output

如果不存在满足所有约束的解,仅输出一行"Infeasible"。

如果对于任意的\(M\),都存在一组解使得目标函数的值大于\(M\),仅输出一行"Unbounded"。

否则,第一行输出一个实数,表示目标函数的最大值\(F\)。当第一行与标准答案的相对误差或绝对误差不超过\(10^{−6}\),你的答案被判为正确。

如果\(t=1\),那么你还需要输出第二行,用空格隔开的\(n\)个非负实数,表示此时\(x_{1},x_{2},⋯,x_{n}\)的取值,如有多组方案请任意输出其中一个。

判断第二行是否合法时,我们首先检验\(F−\sum^{n}_{j=1}c_{j}x_j\)是否为\(0\),再对于所有\(i\),检验\(min\{0,b_i−\sum^n_{j=1}a_{ij}x_{j} \}\)是否为\(0\)。检验时我们会将其中大于\(0\)的项和不大于\(0\)的项的绝对值分别相加得到\(S+\)和\(S−\),如果\(S+\)和\(S−\)的相对误差或绝对误差不超过\(10^{−6}\),则判为正确。

如果\(t=0\),或者出现Infeasible或Unbounded时,不需要输出第二行。

Sample Input

2 2 1

1 1

2 1 6

-1 2 3

Sample Output

4.2

1.8 2.4

标准线性规划板子题。

具体做法戳这里

贴份代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std; #define maxn (30)
#define eps (1e-8) int N,M,op,tot,q[maxn],idx[maxn],idy[maxn]; double a[maxn][maxn],A[maxn]; inline void pivot(int x,int y)
{
swap(idy[x],idx[y]);
double tmp = a[x][y]; a[x][y] = 1/a[x][y];
for (int i = 0;i <= N;++i) if (y != i) a[x][i] /= tmp;
tot = 0; for (int i = 0;i <= N;++i) if (i != y&&(a[x][i] > eps||a[x][i] < -eps)) q[++tot] = i;
for (int i = 0;i <= M;++i)
{
if ((x == i)||(a[i][y] < eps&&a[i][y] > -eps)) continue;
for (int j = 1;j <= tot;++j) a[i][q[j]] -= a[x][q[j]]*a[i][y];
a[i][y] = -a[i][y]/tmp;
}
} int main()
{
freopen("179.in","r",stdin);
freopen("179.out","w",stdout);
scanf("%d %d %d",&N,&M,&op); srand(233);
for (int i = 1;i <= N;++i) scanf("%lf",a[0]+i);
for (int i = 1;i <= M;++i)
{
for (int j = 1;j <= N;++j) scanf("%lf",a[i]+j);
scanf("%lf",a[i]); }
for (int i = 1;i <= N;++i) idx[i] = i;
for (int i = 1;i <= M;++i) idy[i] = i+N;
while (true)
{
int x = 0,y = 0;
for (int i = 1;i <= M;++i) if (a[i][0] < -eps&&((!x)||(rand()&1))) x = i; if (!x) break;
for (int i = 1;i <= N;++i) if (a[x][i] < -eps&&((!y)||(rand()&1))) y = i; if (!y) return puts("Infeasible"),0;
pivot(x,y);
}
while (true)
{
int x = 0,y = 0; double mn = 1e15;
for (int i = 1;i <= N;++i) if (a[0][i] > eps) { y = i; break; } if (!y) break;
for (int 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) return puts("Unbounded"),0;
pivot(x,y);
}
printf("%.8lf\n",-a[0][0]); if (!op) return 0;
for (int i = 1;i <= M;++i) if (idy[i] <= N) A[idy[i]] = a[i][0];
for (int i = 1;i <= N;++i) printf("%.8lf ",A[i]);
fclose(stdin); fclose(stdout);
return 0;
}

UOJ179 线性规划的更多相关文章

  1. 【UOJ179】线性规划(单纯形)

    题意: 思路:单纯形模板 ..,..]of double; idx,idy,q:..]of longint; c:..]of double; n,m,i,j,op,x,y:longint; eps,m ...

  2. 使用Python scipy linprog 线性规划求最大值或最小值(使用Python学习数学建模笔记)

    函数格式 scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='simp ...

  3. 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 ...

  4. 对偶理论、拉格朗日对偶问题、LP线性规划对偶性质

    Lagrange 对偶问题 定义其的对偶问题: Lagrange函数 考虑线性规划问题 若取集合约束D={x|x≥0},则该线性规划问题的Lagrange函数为 线性规划的对偶问题为: 对偶定理原问题 ...

  5. 用Microsoft.Solver.Foundation进行线性规划,为WPF应用添加智能

    在管理信息系统的开发过程中,往往会涉及到一些线性规划数学模型,例如资源配置优化.微软的Microsoft.Solver.Foundation是一个数学库,可以很好的对线性规划问题进行求解.关于它的细节 ...

  6. 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)

    写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...

  7. matlab绘图--线性规划图解法示意

    matlab绘图--线性规划图解法示意 图解法 matlab绘图 区域填充 线性规划问题: matlab绘图 L1=[4,0;4,4];  plot(L1(:,1),L1(:,2));hold on  ...

  8. hdu 4091 线性规划

    分析转自:http://blog.csdn.net/dongdongzhang_/article/details/7955136 题意 :  背包能装体积为N,  有两种宝石, 数量无限, 不能切割. ...

  9. 建模算法(一)——线性规划

    一.解决问题 主要是安排现有资源(一定),取得最好的效益的问题解决,而且约束条件都是线性的. 二.数学模型 1.一般数学模型 2.MATLAB数学模型 其中c,x都是列向量,A,Aeq是一个合适的矩阵 ...

随机推荐

  1. TCPDUMP Command Examples

    tcpdump command is also called as packet analyzer. tcpdump command will work on most flavors of unix ...

  2. Eclipse内存溢出问题

    我们经常遇到eclipse内存溢出问题,实际上只需要修改eclipse程序目录下的eclipse.ini文件, -Xms40m -Xmx1000m -XX:MaxPermSize=256m

  3. uboot之at91sam9g45移植

    一.第一阶段,无修改 二.第二阶段 u-boot-1.3.4\lib_arm\board.c 1.增加头文件 2.增加版本号 3.start_armboot中初始化部分 板级初始化部分init_seq ...

  4. Velocity 入门(一)

    Velocity是一种Java模版引擎技术,该项目由Apache提出.因为非常好用,和工作中有啥用,所以我在在理简单的入门一下. 网上找了很多教程,写的不是很明白,要么就是全部拷贝下来时候运行不起来. ...

  5. 20160501--struts2入门3

    一.自定义拦截器 要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口: public class PermissionInterc ...

  6. Android Toast 设置到屏幕中间,自定义Toast的实现方法,及其说明

    http://blog.csdn.net/wangfayinn/article/details/8065763 Android Toast用于在手机屏幕上向用户显示一条信息,一段时间后信息会自动消失. ...

  7. 使用PDO持久化连接

    无论是何种编程语言,几乎都要经常与各种数据库打交道.不过,众所周知的是,在程序与数据库之间建立连接是一件比较耗费资源的事情,因此编程技术领域的许多专家.前辈们就设想并提出了各种解决方案,以减少不必要的 ...

  8. Candence下对“跨页连接器(off-page connector)”进行批量重命名的方法

    parts.ports.alias等等均可以在“属性编辑器(Property Editor)”中进行查看编辑,并通过复制到Excel等表格软件来进行批量修改.之后再粘贴回去的方法进行批量编辑.但是“跨 ...

  9. 关于使用用友华表Cell控件按需打印行的方法

    分享下只需一个cll文件按需打印行的觉得最好的方式:1.cell文件要打印行的地方最好不要全删了,留一行,设置好单元格样式(字体.对齐方式.折行自适应等),后面会省一些代码: 2.使用CopyRang ...

  10. cognos 10.2.2 搭建网关做负载均衡

    最近要设计cognos服务器灾备模式,所以想到了cognos10自带的gateway负载均衡模式,搭建起来还是挺简洁的 设计背景: cognos主服务器:231 cognos灾备服务器:238 gat ...