您的位置:首页 > 其它

线性规划初探

2016-07-10 21:24 253 查看
看完《算法导论》肯定会写单纯形

因为单纯形不仅好写而且《算法导论》里讲的很清楚

附赠uoj179的模板一个

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stdlib.h>

using namespace std;
const double eps=1e-9;
double a[1010][10010];
int n,m;

int dcmp(double x)
{
if (fabs(x)<=eps) return 0;
if (x>0) return 1; else return -1;
}

void pivot(int x,int y)
{
double k=a[x][y]; a[x][y]=1;
for (int i=0; i<=n; i++) a[x][i]/=k;
for (int i=0; i<=m; i++)
if (i!=x&&dcmp(a[i][y])!=0)
{
k=a[i][y]; a[i][y]=0;
a[i][0]+=(i?-1:1)*k*a[x][0];
for (int j=1; j<=n; j++) a[i][j]-=k*a[x][j];
}
}
void simplex()
{
while (1)
{
int x=0,y=0;
for (int i=1; i<=n; i++)
if (dcmp(a[0][i])>0) {y=i;break;}
if (!y) break;
double mi=1e20;
for (int i=1; i<=m; i++)
if (dcmp(a[i][y])>0&&(!x||mi>a[i][0]/a[i][y])) {x=i; mi=a[i][0]/a[i][y];}
if (!x) break;
pivot(x,y);
}
}

int main()
{
scanf("%d%d",&m,&n);
for (int i=1; i<=m; i++) scanf("%lf",&a[i][0]);
for (int i=1; i<=n; i++)
{
int l,r,d;
scanf("%d%d%d",&l,&r,&d);
for (int j=l; j<=r; j++) a[j][i]=1;
a[0][i]=d;
}
simplex();
printf("%d\n",(int)a[0][0]);
return 0;
}


3112
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: