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 double eps=1e-8;
 8 const int mxn=110;
 9 int read(){
10     int x=0,f=1;char ch=getchar();
11     while(ch<‘0‘ || ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
12     while(ch>=‘0‘ && ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
13     return x*f;
14 }
15
16 int n,m,t;
17 double c[mxn];
18 double a[mxn][mxn];
19 int idx[mxn],idy[mxn];
20 int st[mxn],top=0;
21 void Pivot(int x,int y){//用idy代换idx
22     swap(idy[x],idx[y]);
23     double tmp=a[x][y];a[x][y]=1/a[x][y];
24     int i,j;top=0;
25     for(i=0;i<=n;i++)if(y!=i)a[x][i]/=tmp;
26     for(i=0;i<=n;i++)if((y!=i) && fabs(a[x][i])>eps)st[++top]=i;
27     for(i=0;i<=m;i++){
28         if((i==x)||(fabs(a[i][y])<eps))continue;
29         for(j=1;j<=top;j++)a[i][st[j]]-=a[x][st[j]]*a[i][y];
30         a[i][y]=-a[i][y]/tmp;
31     }
32     return;
33 }
34 void Simplex(){
35     int i,j;
36     while(1){
37         int x=0,y=0;double mn=1e15;
38         for(i=1;i<=n;i++)if(a[0][i]>eps){y=i;break;}
39         if(!y)break;
40         for(i=1;i<=m;i++){
41             if(a[i][y]>eps && (a[i][0]/a[i][y]<mn)){
42                 mn=a[i][0]/a[i][y];
43                 x=i;
44             }
45         }
46         if(!x){printf("Unbounded\n");exit(0);}
47         Pivot(x,y);
48     }
49     return;
50 }
51 int main(){
52     int i,j;
53     n=read();m=read();t=read();
54     for(i=1;i<=n;i++)a[0][i]=read();//目标函数
55     for(i=1;i<=m;i++){
56         for(j=1;j<=n;j++)a[i][j]=read();
57         a[i][0]=read();
58     }
59     for(i=1;i<=n;i++)idx[i]=i;//基变量
60     for(i=1;i<=m;i++)idy[i]=i+n;//非基变量
61     while(1){
62         int x=0,y=0;
63         for(i=1;i<=m;i++)if(a[i][0]<-eps && ((!x)||(rand()&1)))x=i;
64         if(!x)break;
65         for(i=1;i<=n;i++)if(a[x][i]<-eps && ((!y)||(rand()&1)))y=i;
66         if(!y){printf("Infeasible\n");return 0;}
67         Pivot(x,y);
68     }
69     Simplex();
70     printf("%.8f\n",-a[0][0]);
71     if(!t)return 0;
72     for(i=1;i<=n;i++)a[0][i]=0;
73     for(i=1;i<=m;i++)if(idy[i]<=n)a[0][idy[i]]=a[i][0];
74     for(i=1;i<=n;i++)printf("%.8f ",a[0][i]);puts("");
75     return 0;
76 }

是一道模板题。

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

有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

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

UOJ#179. 线性规划[模板]的相关文章

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

[UOJ#35] [UOJ后缀数组模板题] 后缀排序 [后缀数组模板]

后缀数组,解决字符串问题的有利工具,本题代码为倍增SA算法 具体解释详见2009年国家集训队论文 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <cstring> 6 #include <cmath> 7 #include <ctime> 8 9 using namespace

单纯形法与线性规划

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

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

[POJ1743] Musical Theme (后缀数组)

题目概述: A musical melody is represented as a sequence of N (1<=N<=20000)notes that are integers in the range 1..88, each representing a key on the piano. It is unfortunate but true that this representation of melodies ignores the notion of musical tim

shopncv4 短信接口 提供商 中国短信网

修改 siteroot\core\framework\libraries\sms.php 修改 siteroot\shop\control\connect_sms.php 会员注册界面,手机注册 siteroot\wap\tmpl\member\register_mobile.html 数据库 mobile_host_type 类型为 3 在 setting 表中,如果cache中有数据,把相应的值也改了! 修改 siteroot\data\logic\connect_api.logic.php

UOJ #146. 【NOIP2015】信息传递 连通分量 tarjan模板题

http://uoj.ac/problem/146 题解:强连通分量 tarjan模板题.同时试了一下codeblock #include<bits/stdc++.h> using namespace std; const int maxn=2e5+5; vector<int> E[maxn]; int dfn[maxn],low[maxn],tot,n,ans=maxn,vis[maxn]; stack<int> S; void tarjan(int x){ low[

模板:线性规划

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=

UOJ#80 二分图最大权匹配 [模板题]

从前一个和谐的班级,有 nlnl 个是男生,有 nrnr 个是女生.编号分别为 1,…,nl1,…,nl 和 1,…,nr1,…,nr. 有若干个这样的条件:第 vv 个男生和第 uu 个女生愿意结为配偶,且结为配偶后幸福程度为 ww. 请问这个班级里幸福程度之和最大是多少? 输入格式 第一行三个正整数,nl,nr,mnl,nr,m. 接下来 mm 行,每行三个整数 v,u,wv,u,w 表示第 vv 个男生和第 uu 个女生愿意结为配偶,且幸福程度为 ww.保证 1≤v≤nl1≤v≤nl,1≤