UOJ179 线性规划
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 线性规划的更多相关文章
- 【UOJ179】线性规划(单纯形)
题意: 思路:单纯形模板 ..,..]of double; idx,idy,q:..]of longint; c:..]of double; n,m,i,j,op,x,y:longint; eps,m ...
- 使用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是一个合适的矩阵 ...
随机推荐
- TCPDUMP Command Examples
tcpdump command is also called as packet analyzer. tcpdump command will work on most flavors of unix ...
- Eclipse内存溢出问题
我们经常遇到eclipse内存溢出问题,实际上只需要修改eclipse程序目录下的eclipse.ini文件, -Xms40m -Xmx1000m -XX:MaxPermSize=256m
- uboot之at91sam9g45移植
一.第一阶段,无修改 二.第二阶段 u-boot-1.3.4\lib_arm\board.c 1.增加头文件 2.增加版本号 3.start_armboot中初始化部分 板级初始化部分init_seq ...
- Velocity 入门(一)
Velocity是一种Java模版引擎技术,该项目由Apache提出.因为非常好用,和工作中有啥用,所以我在在理简单的入门一下. 网上找了很多教程,写的不是很明白,要么就是全部拷贝下来时候运行不起来. ...
- 20160501--struts2入门3
一.自定义拦截器 要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口: public class PermissionInterc ...
- Android Toast 设置到屏幕中间,自定义Toast的实现方法,及其说明
http://blog.csdn.net/wangfayinn/article/details/8065763 Android Toast用于在手机屏幕上向用户显示一条信息,一段时间后信息会自动消失. ...
- 使用PDO持久化连接
无论是何种编程语言,几乎都要经常与各种数据库打交道.不过,众所周知的是,在程序与数据库之间建立连接是一件比较耗费资源的事情,因此编程技术领域的许多专家.前辈们就设想并提出了各种解决方案,以减少不必要的 ...
- Candence下对“跨页连接器(off-page connector)”进行批量重命名的方法
parts.ports.alias等等均可以在“属性编辑器(Property Editor)”中进行查看编辑,并通过复制到Excel等表格软件来进行批量修改.之后再粘贴回去的方法进行批量编辑.但是“跨 ...
- 关于使用用友华表Cell控件按需打印行的方法
分享下只需一个cll文件按需打印行的觉得最好的方式:1.cell文件要打印行的地方最好不要全删了,留一行,设置好单元格样式(字体.对齐方式.折行自适应等),后面会省一些代码: 2.使用CopyRang ...
- cognos 10.2.2 搭建网关做负载均衡
最近要设计cognos服务器灾备模式,所以想到了cognos10自带的gateway负载均衡模式,搭建起来还是挺简洁的 设计背景: cognos主服务器:231 cognos灾备服务器:238 gat ...