您的位置:首页 > 其它

BZOJ 1061 Noi2008 志愿者招募 单纯形

2015-10-20 16:12 393 查看
wyfcyx的《线性规划与单纯形算法》
http://wenku.baidu.com/view/ce5784754a7302768f99391d
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define maxn 1010
#define maxm 10010
#define inf 2147483647
using namespace std;
long long a[maxn][maxm],next[maxm];
int n,m;

void pivot(int l,int e)
{
int last=-1;
for (int i=0;i<=m;i++)
if (a[l][i])
{
next[i]=last;
last=i;
}
for (int i=0;i<=n;i++)
{
if (a[i][e]==0||i==l) continue;
for (int j=last;j!=-1;j=next[j])
{
if (j==e) continue;
a[i][j]-=a[i][e]*a[l][j];
}
a[i][e]=-a[i][e];
}
}

long long simplex()
{
while (1)
{
int now=0;
for (int i=1;i<=m;i++)
if (a[0][i]>0) { now=i; break; }
if (now==0) return -a[0][0];
int tmp,mi=inf;
for (int i=1;i<=n;i++)
{
if (a[i][now]>0&&a[i][0]<mi)
{
tmp=i;
mi=a[i][0];
}
}
pivot(tmp,now);
}
}
int main()
{
scanf("%d%d", &n, &m);
for(int i=1;i<=n;i++) scanf("%lld", &a[0][i]);
int l, r, d;
for(int i=1;i<=m;i++)
{
scanf("%d%d%lld", &l, &r, &d);
a[i][0] = d;
for(int j=l;j<=r;j++) a[i][j] = 1;
}
long long ans = simplex();
printf("%lld\n", ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: