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行有n+1个整数ai1,ai2,?,ain,bi,整数间均用一个空格分隔。
输出格式
如果不存在满足所有约束的解,仅输出一行”Infeasible”。
如果对于任意的M,都存在一组解使得目标函数的值大于M,仅输出一行”Unbounded”。
否则,第一行输出一个实数,表示目标函数的最大值F。当第一行与标准答案的相对误差或绝对误差不超过10−6,你的答案被判为正确。
如果t=1,那么你还需要输出第二行,用空格隔开的n个非负实数,表示此时x1,x2,?,xn的取值,如有多组方案请任意输出其中一个。

判断第二行是否合法时,我们首先检验F−cjxj,j∈(1,n)是否为0,再对于所有ii,检验min{0,bi−aijxj,j∈(1,n)}是否为0。检验时我们会将其中大于0的项和不大于0的项的绝对值分别相加得到S+和S−,如果S+和S−的相对误差或绝对误差不超过10−6,则判为正确。

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

线性规划单纯型法模板

这个模板不知为何被卡了,UOJ只有97分,玄学

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<ctime>
 7 #define eps (1e-8)
 8 #define inf (1e20)
 9 using namespace std;
10 long double a[51][51],ans[51];
11 int id[51],n,m,t;
12 void pivot(int l,int e)
13 {int i,j;
14   swap(id[n+l],id[e]);
15   long double t=a[l][e];a[l][e]=1.0;
16   int arr[25],tot=0;
17   for (i=0;i<=n;i++)
18     if (fabs(a[l][i])>eps)
19       {
20     arr[++tot]=i;
21     a[l][i]/=t;
22       }
23   for (i=0;i<=m;i++)
24     if (i!=l&&fabs(a[i][e])>eps)
25       {
26     t=a[i][e];a[i][e]=0;
27     for (j=1;j<=tot;j++)
28       {
29         a[i][arr[j]]-=t*a[l][arr[j]];
30       }
31       }
32 }
33 bool init()
34 {int i,j;
35   while (1)
36     {
37       int x=0,y=0;
38       for (i=1;i<=m;i++)
39     if (a[i][0]<=-eps&&(!x||rand()&1)) x=i;
40       if (x==0) return 1;
41       for (i=1;i<=n;i++)
42     if (a[x][i]<=-eps&&(!y||rand()&1)) y=i;
43       if (y==0) return 0;
44       pivot(x,y);
45     }
46 }
47 bool simplex()
48 {int i;
49   while (1)
50     {
51       int x=0,y=0;
52       for (i=1;i<=n;i++)
53     if (a[0][i]>eps)
54       {x=i;break;}
55       if (x==0) return 1;
56       long double tmp;
57       for (i=1;i<=m;i++)
58     if (a[i][x]>eps&&(y==0||a[i][0]/a[i][x]<tmp))
59       {
60         tmp=a[i][0]/a[i][x];
61         y=i;
62       }
63       if (y==0) return 0;
64       pivot(y,x);
65     }
66 }
67 int main()
68 {int i,j;
69   srand(time(0));
70   cin>>n>>m>>t;
71   for (i=1;i<=n;i++)
72     scanf("%Lf",&a[0][i]);
73   for (i=1;i<=m;i++)
74     {
75       for (j=1;j<=n;j++)
76     {
77       scanf("%Lf",&a[i][j]);
78     }
79       scanf("%Lf",&a[i][0]);
80     }
81   for (i=1;i<=n;i++)
82     id[i]=i;
83   if (!init())
84     {
85       printf("Infeasible");
86       return 0;
87     }
88   if (!simplex())
89     {
90       printf("Unbounded");
91       return 0;
92     }
93   printf("%0.9Lf\n",-a[0][0]);
94   for (i=1;i<=m;i++)
95     ans[id[n+i]]=a[i][0];
96   if (t)
97   for (i=1;i<=n;i++)
98     printf("%0.9Lf ",ans[i]);
99 }

原文地址:https://www.cnblogs.com/Y-E-T-I/p/8456785.html

时间: 2024-11-13 01:55:48

UOJ 179 线性规划的相关文章

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

单纯形法与线性规划

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

线性规划初探

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

线性规划的代码实现

线性规划其实实现很简单, 关键就是theta的训练.下面是我的JAVA代码实现: 我用的训练集为: 1.0 2.0 1.52.0 3.5 3.4-1.2 2.0 3.54.7 3.2 4.52.3 -2.5 5.4 下面是类与函数的实现: 1 import java.io.BufferedReader; 2 import java.io.File; 3 import java.io.FileReader; 4 import java.io.IOException; 5 6 /** 7 * 线性回

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

uoj#87. mx的仙人掌

1 //Achen 2 #include<bits/stdc++.h> 3 #define For(i,a,b) for(int i=(a);i<=(b);i++) 4 #define Rep(i,a,b) for(int i=(a);i>=(b);i--) 5 #define Formylove return 0 6 const int N=2e6+7,mod=571111; 7 typedef long long LL; 8 typedef double db; 9 using

【UOJ】【UR #2】猪猪侠再战括号序列(splay/贪心)

http://uoj.ac/problem/31 纪念伟大的没有调出来的splay... 竟然那个find那里写错了!!!!!!!!!!!!! 以后要记住:一定要好好想过! (正解的话我就不写了,太简单了.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #

[UOJ#220][BZOJ4651][Noi2016]网格

试题描述 跳蚤国王和蛐蛐国王在玩一个游戏. 他们在一个 n 行 m 列的网格上排兵布阵.其中的 c 个格子中 (0≤c≤nm),每个格子有一只蛐蛐,其余的格子中,每个格子有一只跳蚤. 我们称占据的格子有公共边的两只跳蚤是相邻的. 我们称两只跳蚤是连通的,当且仅当这两只跳蚤相邻,或存在另一只跳蚤与这两只跳蚤都连通. 现在,蛐蛐国王希望,将某些(0 个,1 个或多个)跳蚤替换成蛐蛐,使得在此之后存在至少两只跳蚤不连通. 例如:我们用图表示一只跳蚤,用图表示一只蛐蛐,那么图 1 描述了一个 n=4,m

UOJ 52 元旦激光炮

http://uoj.ac/problem/52 题意:每次可以得到3个序列中 思路:每次分别取出三个序列的K/3长度的位置,取最小的那个,然后每次减掉它,总复杂度是Nlog3N #include "kth.h" #include<algorithm> int C[2000005]; int query_kth(int n_a, int n_b, int n_c, int k) { int Len=k; int la=0,lb=0,lc=0; int ans=0; whil