模板:线性规划

 1 //数组开不下时勿用
 2 const int maxn=110;
 3 const double eps=1e-10;
 4 double a[maxn][maxn];
 5 double b[maxn],c[maxn],v;
 6 int N[maxn],B[maxn],n,m;
 7
 8 int SGN(double x){
 9     return (x>eps)-(x<-eps);
10 }
11
12 void Init(){
13     N[0]=B[0]=0;v=0.0;
14     for(int i=1;i<=n;i++)N[++N[0]]=i;
15     for(int i=1;i<=m;i++)B[++B[0]]=n+i;
16 }
17
18 void Pivot(int l,int e){
19     b[e]=b[l]/a[l][e];
20     a[e][l]=1.0/a[l][e];
21     for(int i=1;i<=N[0];i++)
22         if(N[i]!=e)a[e][N[i]]=a[l][N[i]]/a[l][e];
23
24     for(int i=1;i<=B[0];i++)
25         if(B[i]!=l){
26             b[B[i]]-=a[B[i]][e]*b[e];
27             a[B[i]][l]=-a[B[i]][e]*a[e][l];
28             for(int j=1;j<=N[0];j++)
29                 if(N[j]!=e)a[B[i]][N[j]]-=a[B[i]][e]*a[e][N[j]];
30         }
31
32     v+=b[e]*c[e];
33     c[l]=-c[e]*a[e][l];
34     for(int i=1;i<=N[0];i++)
35         if(N[i]!=e)c[N[i]]-=c[e]*a[e][N[i]];
36     for(int i=1;i<=N[0];i++)if(N[i]==e)N[i]=l;
37     for(int i=1;i<=B[0];i++)if(B[i]==l)B[i]=e;
38 }
39
40 bool Simplex(){
41     while(true){
42         double lam=-1;
43         int e=maxn,l=maxn;
44         for(int i=1;i<=N[0];i++)
45             if(SGN(c[N[i]])>0&&e>N[i])
46                 e=N[i];
47         if(e==maxn)break;
48
49         for(int i=1;i<=B[0];i++)
50             if(SGN(a[B[i]][e])>0){
51                 double tmp=b[B[i]]/a[B[i]][e];
52                 if(lam==-1||SGN(tmp-lam)<0||SGN(tmp-lam)==0&&l>B[i])
53                     lam=tmp,l=B[i];
54             }
55         if(l==maxn)return false;
56         Pivot(l,e);
57     }
58     return true;
59 }
时间: 2024-10-13 11:51:14

模板:线性规划的相关文章

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

线性规划初探

看完<算法导论>肯定会写单纯形 因为单纯形不仅好写而且<算法导论>里讲的很清楚 附赠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

清华论文模板

thuthesis.cls 1 %% 2 %% This is file `thuthesis.cls', 3 %% generated with the docstrip utility. 4 %% 5 %% The original source files were: 6 %% 7 %% thuthesis.dtx (with options: `cls') 8 %% 9 %% This is a generated file. 10 %% 11 %% Copyright (C) 2005

半平面交模板

摘自http://blog.csdn.net/accry/article/details/6070621 首先解决问题:什么是半平面? 顾名思义,半平面就是指平面的一半,我们知道,一条直线可以将平面分为两个部分,那么这两个部分就叫做两个半平面. 然后,半平面怎么表示呢? 二维坐标系下,直线可以表示为ax + by + c = 0,那么两个半平面则可以表示为ax + by + c >= 0 和ax + by + c < 0,这就是半平面的表示方法. 还有,半平面的交是神马玩意? 其实就是一个方程

UOJ 179 线性规划

这是一道模板题. 本题中你需要求解一个标准型线性规划: 有n个实数变量x1,x2,?,xn和m条约束,其中第i条约束形如aij*xj≤bi ,j∈(1,n),i∈(1,m) 此外这n个变量需要满足非负性限制,即xj≥0. 在满足上述所有条件的情况下,你需要指定每个变量xj的取值,使得目标函数F=cj*xj ,j∈(1,n)的值最大. 输入格式 第一行三个正整数 n,m,t.其中t∈{0,1}. 第二行有n个整数c1,c2,?,cn,整数间均用一个空格分隔. 接下来m行,每行代表一条约束,其中第i

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}|,

[长期更新]模板&amp;算法学习情况

这里仅作为自我检查用,模板代码请移步其他博文 标+的表示已学完,标?的表示需要进一步学习,标-的表示有计划但未开始学习,标*的表示暂时没有计划学习 数学 *BSGS ?FFT&NTT *Lucas&扩展Lucas *差分约束 ?多项式处理 -高斯消元 -线性基 ?矩阵快速幂 -卡特兰数 +扩展欧几里得 +莫比乌斯反演 *容斥 -斯特林数 *线性规划 *中国剩余定理 筛法 +线性筛 -杜教筛 *洲阁筛 计算几何 ?凸包&旋转卡壳(xuan2zhuan3qia3ke2) *半平面交 数

单纯形法与线性规划

Preface 好久之前就想学学单纯形法了,因为据说用途非常广泛,而且最近恰好要做有关的题目 感觉还是挺高级的一个姿势吧,以下参考自一,二以及2016年的集训队论文,最后看的是bzt的板子,默认大家都知道线性规划是什么且具有一定线性代数的基础(好把没有也没有关系) 线性规划的标准型与松弛型 线性规划的标准型一般是这样的: 而松弛型是这样的: 桥豆麻袋,上面的标准型我能理解,这个松弛型是个什么鬼东西,怎么让变量更多了呢? 不要慌我们来观察一下,标准型简洁是简洁,但是它的约束符号是不等号(小于等于)

Vue.js项目模板搭建

前言 从今年(2017年)年初起,我们团队开始引入「Vue.js」开发移动端的产品.作为团队的领头人,我的首要任务就是设计 整体的架构 .一个良好的架构必定是具备丰富的开发经验后才能搭建出来的.虽然我有多年的前端开发经验,但就「Vue.js」来说,仍然是个新手.所幸「Vue.js」有一个配套工具「Vue-CLI」,它提供了一些比较成熟的项目模板,很大程度上降低了上手的难度.然而,很多具体的问题还是要自己思考和解决的. 项目划分 我们公司的H5产品大部分是嵌套在手机客户端里面的页面.每个项目的功能