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;
}
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;
}
相关文章推荐
- ImageMagick 一个图像处理较好的库
- Cstring和Char*互转 关键在格式符%S和%s的区别
- duoj Almost sorted interval 单调队列
- 单利模式最安全高效写法
- 如何自定义滚动条?
- HTTP访问控制(CORS)
- 数独游戏答案不唯一
- Codevs1700 施工路线第二季
- android监测用户刚刚拍照
- sublime
- 用java实现视频截帧的方法
- 如何定义枚举字符串
- 20135202闫佳歆-第二章家庭作业-2.69
- 使用javascript取得网站的根路径
- JqGrid单选
- Protege A DOT error has occurred错误
- C语言实现大整数乘法代码的完整代码及运行结果
- 传域名服务商“新网”恶意调价:降代理级别强制消费
- mysql事务
- [前端] jquery获取append追加的input值