[BZOJ1061][NOI2008]志愿者招募 费用流
来源:互联网 发布:常见的网络协议有哪些 编辑:程序博客网 时间:2024/05/18 22:45
列出几个线性规划的式子
添加变量把不等式变成流量恒等式
按照式子建图,跑最小费用最大流
答案即为费用
https://www.byvoid.com/zhs/blog/noi-2008-employee
/************************************************************** Problem: 1061 User: di4CoveRy Language: C++ Result: Accepted Time:2152 ms Memory:5256 kb****************************************************************/#include <bits/stdc++.h>#define INF (1<<29)#define N 2050 #define M 200050using namespace std;typedef long long LL;int head[N],cnt=1,tot,S,T;int p[N],rp[N],L[N],a,b,c[N],d;LL dis[N];int n,m,k;LL ans;inline int rd() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}struct Edge{ int a,b,v,cost,next; }e[M],id;inline void add(int a,int b,int v,int cost) { if (!a || !b) return ; e[++cnt] = (Edge){ a,b,v,cost,head[a] }, head[a] = cnt; e[++cnt] = (Edge){ b,a,0,-cost,head[b] },head[b] = cnt;}#define cp e[i].v #define B e[i].b bool SPFA() { bool flag = false; for (int i=1;i<=tot;i++) p[i] = 0, dis[i] = (1LL<<62); dis[S] = 0; queue<int> q; q.push(S); while (!q.empty()) { int u = q.front(); q.pop(); if (u == T) flag = true; for (int i=head[u];i;i=e[i].next) if (cp > 0 && dis[u] + e[i].cost < dis[B]) { dis[B] = dis[u] + e[i].cost; p[B] = i; q.push(B); } } return flag; } void mcf() { int g = p[T] , flow = INF; while (g) { flow = min(flow , e[g].v); g = p[ e[g].a ]; } g = p[T]; while (g) { e[g ].v -= flow; e[g^1].v += flow; ans += 1LL * e[g].cost * flow; g = p[ e[g].a ]; }}int main() { n = rd(), m = rd(); for (int _=1;_<=n;_++) p[_] = rd(); for (int _=1;_<=n;_++) rp[_] = p[_]-p[_-1]; S = ++tot, T = ++tot; for (int _=0;_<=n+1;_++) L[_] = ++tot; for (int _=1;_<=n;_++) if (rp[_] > 0) add(S, L[_], rp[_], 0); else add(L[_], T, -rp[_], 0); for (int _=1;_<=n;_++) add(L[_+1], L[_], INF, 0); add(L[n+1], T, p[n], 0); for (int _=1;_<=m;_++) { int a = rd(), b = rd(), v = rd(); add(L[a], L[b+1], INF, v); } while (SPFA()) mcf(); cout << ans << endl; return 0;}
0 0
- bzoj1061: [Noi2008]志愿者招募 费用流
- [BZOJ1061]NOI2008志愿者招募|费用流|线性规划
- [BZOJ1061][NOI2008]志愿者招募 费用流
- [BZOJ1061] [NOI2008] 志愿者招募 - 最小费用最大流
- 【费用流|单纯形】BZOJ1061 [Noi2008]志愿者招募
- bzoj1061: [Noi2008]志愿者招募(最小费用最大流)
- bzoj1061 [Noi2008]志愿者招募(线性规划/费用流)
- [BZOJ1061][Noi2008]志愿者招募
- bzoj1061【NOI2008】志愿者招募
- 【NOI2008】【BZOJ1061】志愿者招募
- bzoj1061: [Noi2008]志愿者招募
- 【NOI2008】BZOJ1061志愿者招募
- [bzoj1061][NOI2008]志愿者招募
- BZOJ1061: [Noi2008]志愿者招募
- BZOJ1061: [Noi2008]志愿者招募
- 【bzoj1061】[Noi2008]志愿者招募
- bzoj1061: [Noi2008]志愿者招募
- bzoj1061: [Noi2008]志愿者招募
- Servlet(16)会话技术Session
- 图片特征匹配算法
- 分数拆分
- selector 与 动态绑定
- Excuses, Excuses!
- [BZOJ1061][NOI2008]志愿者招募 费用流
- 基本文件操作&fopen函数&FILE指针&ftell &fseek&rewind&fgets文件复制&feof
- EM算法(期望最大化)——理论部分
- 各种排序方法的c++实现
- JavaScript this 的理解
- effective java 读书笔记---第7章 方法
- [省选] [线段树] [差分数组] [BZOJ1558] [JSOI2009] 等差数列
- Linux下mysql备份
- Java学习笔记 Day04 (for循环嵌套、函数以及函数重载、数组)