UOJ179 - 线性规划

Portal

Description

求解一个标准型线性规划:

有\(n\)个实数变量\(x_1,x_2,...,x_n\)和\(m\)条约束,其中第\(i\)条约束形如 \(\sum_{j=1}^na_{ij}x_j\leq b_i\)。

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

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

其中\(1≤n,m≤20, 0≤|a_{ij}|,|b_i|,|c_j|≤100\)。

Solution

线性规划模板题,用单纯形可解。墙裂推荐看看这篇论文:2 Solving LPs: The Simplex Algorithm of George Dantzig

Code

//线性规划
#include <cstdio>
#include <algorithm>
using namespace std;
inline int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<‘0‘||‘9‘<ch) f=(ch^‘-‘)?f:-1,ch=getchar();
    while(‘0‘<=ch&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar();
    return x*f;
}
int const N=30;
double const EPS=1e-8;
bool equal0(double x) {return -EPS<x&&x<EPS;}
int n,m,T;
double a[N][N];
int b[N],id[N<<1];
void pivot(int x,int y)
{
    swap(id[n+x],id[y]);
    double t=a[x][y]; a[x][y]=1;
    for(int i=0;i<=n;i++) a[x][i]/=t;
    for(int i=0;i<=m;i++)
    {
        if(i==x||equal0(a[i][y])) continue;
        t=a[i][y],a[i][y]=0;
        for(int j=0;j<=n;j++) a[i][j]-=a[x][j]*t;
    }
}
bool simplex()
{
    while(true)
    {
        int x=0,y=0;
        for(int j=1;!y&&j<=n;j++) if(a[0][j]>EPS) y=j;
        if(!y) return true;
        double minX=1e18;
        for(int i=1;i<=m;i++)
            if(a[i][y]>EPS&&minX>a[i][0]/a[i][y]) minX=a[i][0]/a[i][y],x=i;
        if(!x) {puts("Unbounded"); return false;}
        pivot(x,y);
    }
}
bool solve()
{
    for(int i=1;i<=n;i++) id[i]=i;
    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) return simplex();
        for(int j=1;j<=n;j++) if(a[x][j]<-EPS&&(!y||rand()&1)) y=j;
        if(!y) {puts("Infeasible"); return false;}
        pivot(x,y);
    }
}
double ans[N];
int main()
{
    n=read(),m=read(),T=read();
    for(int i=1;i<=n;i++) a[0][i]=read();
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++) a[i][j]=read();
        a[i][0]=read();
    }
    if(solve())
    {
        printf("%.10lf\n",-a[0][0]);
        if(!T) return 0;
        for(int i=1;i<=m;i++) ans[id[n+i]]=a[i][0];
        for(int i=1;i<=n;i++) printf("%.10lf ",ans[i]);
    }
    return 0;
}

P.S.

学了一整天,弃疗背板子,然后被这篇论文拯救!

不知道uoj有什么神数据,满分代码我都看不懂...不过这个做别的线性规划都不会出锅哒。

原文地址:https://www.cnblogs.com/VisJiao/p/uoj179.html

时间: 2024-10-19 11:37:42

UOJ179 - 线性规划的相关文章

线性规划初探

看完<算法导论>肯定会写单纯形 因为单纯形不仅好写而且<算法导论>里讲的很清楚 附赠uoj179的模板一个 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #include<stdlib.h> 7 8 using namespace std; 9 const

数学(线性规划): ZJOI2013 防守战线

偷懒用的线性规划. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 const int maxr=1010; 6 const int maxc=10010; 7 8 int n,m,nxt[maxc]; 9 int a[maxr][maxc]; 10 11 12 void Pivot(int l,int e){ 13 int pre=maxc-

【网络流】线性规划的最小割建模方式

前几天在师大附中听课,大概了解了一些关于网络流的建模方式,然后今天上午做了一些题目,在这里总结一下. 最小割的线性规划建模方式: 有一些0/1变量Xi,怎么怎么样之后会消耗某些代价或者获得某些利益,而最后的总收益可以写成如下的形式: min{ Σmax{Xi-Xj,0}*Wi } 其中Wi必须是正数. 那么假设源为1,汇为0,就将Xi连一条流量为Wi的边到Xj. 如果有形如1-Xi之类的形式就是从源向Xi连边,Xi-0这种形式就是Xi向汇点连边. 那么如果Wi是负数怎么办? 比如Xi*Wi(Wi

线性规划问题中的差分约束与最短路径

先给一个线性规划的定义: 在通用的线性规划问题中,我们通常给定一个m*n的矩阵A,一个m维的向量和一个n维向量(权值函数).我们希望找到一个n维向量x,使得在由Ax<=b给定的m个约束条件下优化目标函数ci*xi,这里的优化是指目标函数的取值最大. 根据矩阵乘法,我们大概脑补出这样一幅图 ps:上图中<号应为<=号(我会告诉你是我懒得改 ) 通过化简我们得到 x1-x3<=b1;x3<=b2;x2-x3<=b3; 这跟我们的最短路径有什么关系呢? 在最短路径的三角不等式

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

传送门 http://uoj.ac/problem/179 震惊,博主竟然还不会线性规划! 单纯形实在学不会啊……背个板子当黑盒用…… 学(chao)了NanoApe dalao的板子 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 using namespace std; 7 const d

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

matlab绘图--线性规划图解法示意 图解法 matlab绘图 区域填充 线性规划问题: matlab绘图 L1=[4,0;4,4]; plot(L1(:,1),L1(:,2));hold on  text(4.1,3.5,'x_1=4','color','b');  L2=[0 3;5 3];  plot(L2(:,1),L2(:,2));hold on  text(0.8,3.1,'x_2=3','color','b');  L3=[0 2.4;5 0.4];  plot(L3(:,1),

线性规划(Simplex单纯形)与对偶问题

线性规划 首先一般所有的线性规划问题我们都可以转换成如下标准型: 但是我们可以发现上面都是不等式,而我们计算中更希望是等式,所以我们引入这个新的概念:松弛型: 很显然我们最后要求是所有的约束左边的变量都不小于0.而求解这类问题,我们又有一套十分便利的模型算法:单纯形 基变量:松弛型等式左边的所有变量 非基变量:松弛型等式右侧的所有变量 基本解:一组基变量和非基变量蕴含着一组基本解,即所有的非基变量都为0,基变量都为等式右侧的常数项(这里要求常数项为正,为负时我们后面讨论) 算法原理: 可证线性规

数学(线性规划):UVAoj 10498 Happiness

Problem GHappiness! Input: standard inputOutput: standard outputTime Limit: 3 seconds Prof. Kaykobad has given Nasa the duty of buying some food for the ACM contestents. Nasa decided to buy n different items. He then asked each of the m contestents h

线性规划 单纯形

求解线性规划最优解问题(全部转化成约束条件<=(非负条件可以是>=),并且求最大值问题) bzoj1061 志愿者招募 题目大意:给定n天,每天需要志愿者ai人:m类志愿者,从si-ti天工作,每人要ci元.求最小费用. 思路:根据题意可以列出目标函数是min sigma(i=1~m)cixi,约束条件是 sigma(i=1~m)Aijxi>=aj(j=1~n)(Aij表示这一天志愿者能否工作),xi>=0.这个问题如果*-1转化的话,可能要求解辅助约束.所以可以用对偶问题来解决,