bzoj 3265 志愿者招募加强版 (单纯形)
2016-04-05 19:10
344 查看
这里对原问题进行了对偶求解
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 520
#define M 200020
#define inf 0x3f3f3f3f
#define eps 1e-8
double A[10100][1020], b[10100], c[1020];
int n, m;
double ans = 0;
void pivot(int l, int e) {
b[l] /= A[l][e];
for(int i = 1; i <= n; ++i) {
if(i != e) {
A[l][i] /= A[l][e];
}
}
A[l][e] = 1 / A[l][e];
for(int i = 1; i <= m; ++i) {
if(i != l && fabs(A[i][e]) > eps) {
b[i] -= A[i][e] * b[l];
for(int j = 1; j <= n; ++j) {
if(j != e) {
A[i][j] -= A[i][e] * A[l][j];
}
}
A[i][e] = -A[i][e] * A[l][e];
}
}
ans += c[e] * b[l];
for(int i = 1; i <= n; ++i) {
if(i != e) {
c[i] -= c[e] * A[l][i];
}
}
c[e] = -c[e] * A[l][e];
}
void simplex() {
while(1) {
int e = -1;
for(int i = 1; i <= n; ++i) {
if(c[i] > eps) {
e = i;
break;
}
}
if(e == -1) return;
double tmp = 1e10;
int l = -1;
for(int i = 1; i <= m; ++i) {
if(A[i][e] > eps && b[i] / A[i][e] < tmp) {
tmp = b[i] / A[i][e], l = i;
}
}
if(l == -1) return;
pivot(l, e);
}
}
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i) {
scanf("%lf", &c[i]);
}
for(int i = 1; i <= m; ++i) {
int s, t, c;
int k;
scanf("%d", &k);
while(k--) {
scanf("%d%d", &s, &t);
for(int j = s; j <= t; ++j) {
A[i][j] = 1;
}
}
scanf("%d", &c);
b[i] = c;
}
simplex();
printf("%d\n", (int)(ans + 0.5));
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 520
#define M 200020
#define inf 0x3f3f3f3f
#define eps 1e-8
double A[10100][1020], b[10100], c[1020];
int n, m;
double ans = 0;
void pivot(int l, int e) {
b[l] /= A[l][e];
for(int i = 1; i <= n; ++i) {
if(i != e) {
A[l][i] /= A[l][e];
}
}
A[l][e] = 1 / A[l][e];
for(int i = 1; i <= m; ++i) {
if(i != l && fabs(A[i][e]) > eps) {
b[i] -= A[i][e] * b[l];
for(int j = 1; j <= n; ++j) {
if(j != e) {
A[i][j] -= A[i][e] * A[l][j];
}
}
A[i][e] = -A[i][e] * A[l][e];
}
}
ans += c[e] * b[l];
for(int i = 1; i <= n; ++i) {
if(i != e) {
c[i] -= c[e] * A[l][i];
}
}
c[e] = -c[e] * A[l][e];
}
void simplex() {
while(1) {
int e = -1;
for(int i = 1; i <= n; ++i) {
if(c[i] > eps) {
e = i;
break;
}
}
if(e == -1) return;
double tmp = 1e10;
int l = -1;
for(int i = 1; i <= m; ++i) {
if(A[i][e] > eps && b[i] / A[i][e] < tmp) {
tmp = b[i] / A[i][e], l = i;
}
}
if(l == -1) return;
pivot(l, e);
}
}
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i) {
scanf("%lf", &c[i]);
}
for(int i = 1; i <= m; ++i) {
int s, t, c;
int k;
scanf("%d", &k);
while(k--) {
scanf("%d%d", &s, &t);
for(int j = s; j <= t; ++j) {
A[i][j] = 1;
}
}
scanf("%d", &c);
b[i] = c;
}
simplex();
printf("%d\n", (int)(ans + 0.5));
return 0;
}
相关文章推荐
- 初识commonjs
- 数据分类K—means 算法的python代码实现
- HDU 4059 The Boss on Mars 容斥原理+逆元
- ytu 2617: B C++时间类的运算符重载
- this关键字
- 长方柱类
- java反射中的动态代理机制(有实例)
- Maven部署多个环境
- Fortran 数组
- drbd
- 第6周-项目3-IP地址类
- 第五周项目三 时间类(1)
- Nmap的那些事儿
- 安卓自制的计算器
- CUDA编程(五)关注内存的存取模式
- Leetcode 95. Unique Binary Search Trees II
- 第五周上机实践项目 项目2--游戏中的角色类(2)
- Redis与Memcached的区别
- 第6周项目1—分数类的雏形
- 打印log信息