我是靠谱客的博主 无语皮带,这篇文章主要介绍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.9Lfn",-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

最后

以上就是无语皮带最近收集整理的关于UOJ 179 线性规划的全部内容,更多相关UOJ内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(126)

评论列表共有 0 条评论

立即
投稿
返回
顶部