最新费用流的模板
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了最新费用流的模板,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3780字,纯文字阅读大概需要6分钟。
内容图文
![最新费用流的模板](/upload/InfoBanner/zyjiaocheng/1268/9fe0fe437dc9420497b6006bc8e76682.jpg)
ccf 货物调度
#include <iostream>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <string>
#include <cmath>
#include <cstdio>
#include <cctype>
#include <ctime>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <complex>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cwchar>
#include <cwctype>
#include <exception>
#include <locale>
#include <numeric>
#include <new>
#include <stdexcept>
#include <limits>
#include <valarray>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <list>
#include <utility>
#include <bitset>
#include <algorithm>
#include <functional>
#include <vector>
#define rep(i, n) for(int i = 0; i < (int)(n); i ++)
#define rep1(i, n) for(int i = 1; i <= (int)(n); i ++)
#define MP make_pair
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int INF = 2147483647;
const int MAXN = 700+10;
struct edge
{
int to, cap, cost, rev;
edge(int t = -1, int ca = 0, int co = 0, int r = -1)
{
to = t;
cap = ca;
cost = co;
rev = r;
}
};
vector<edge> E;
vector<int> G[MAXN + 5];
bool vis[MAXN + 5];
void add_edge(int u, int v, int cap, int cost)
{
int id = E.size();
E.push_back(edge(v, cap, cost, id + 1));
E.push_back(edge(u, 0, -cost, id));
G[u].push_back(id);
G[v].push_back(id + 1);
}
int n, dist;
int dfs(int v, int t, int& cost, int cf)
{
if(cf == 0) return 0;
if(v == t) {
cost += dist * cf;
return cf;
}
vis[v] = true;
int gf = cf;
rep(i, G[v].size()) {
edge& e = E[G[v][i]];
if(e.cost == 0 && !vis[e.to]) {
int f = dfs(e.to, t, cost, min(cf, e.cap));
cf -= f;
e.cap -= f;
E[e.rev].cap += f;
}
}
return gf - cf;
}
bool label()
{
int cur = INF;
rep1(i, n) if(vis[i])
rep(j, G[i].size()) {
edge& e = E[G[i][j]];
if(!vis[e.to] && e.cap > 0) cur = min(cur, e.cost);
}
if(cur == INF) return false;
rep1(i, n) if(vis[i])
rep(j, G[i].size()) {
edge& e = E[G[i][j]];
e.cost -= cur;
E[e.rev].cost += cur;
}
dist += cur;
return true;
}
void MCNF(int s, int t, int& flow, int& cost)
{
dist = 0;
flow = cost = 0;
int cf = 0;
do do {
memset(vis, false, sizeof(vis));
flow += cf = dfs(s, t, cost, INF);
} while(cf > 0);
while(label());
}
const int maxn = 1e2+10;
int a[maxn][8], b[maxn][8];
int v[maxn], w[maxn];
typedef pair<int, int> pii;
vector<pii> GG[maxn];
int main()
{
int m, f = 0, c = 0;
scanf("%d%d", &n, &m);
int ss=n*7+1, tt = n*7+2;
int x, y, z;
for(int i=1; i<=n; i++){
for(int j=1; j<=7; j++) scanf("%d", &a[i][j]);
for(int j=1; j<=7; j++) scanf("%d", &b[i][j]);
scanf("%d%d", &v[i], &w[i]);
}
for(int i=1; i<=m; i++){
cin>>x>>y>>z;
GG[x].push_back(make_pair(y, z));
GG[y].push_back(make_pair(x, z));
}
for(int i=1; i<=n; i++){
for(int j=1; j<=7; j++){
add_edge(ss, (i-1)*7+j, a[i][j], 0);
}
for(int j=1; j<=7; j++){
add_edge((i-1)*7+j, tt, b[i][j], 0);
}
for(int j=1; j<=7; j++){
if(j<7)add_edge((i-1)*7+j, (i-1)*7+j+1, v[i], w[i]);
else add_edge((i-1)*7+j, (i-1)*7+1, v[i], w[i]);
}
for(int j=0; j<GG[i].size(); j++){
PII temp = GG[i][j];
int v = temp.first;
int ww = temp.second;
for(int k=1; k<=7; k++){
add_edge((i-1)*7+k, (v-1)*7+k, INF, ww);
}
}
}
n = 7*n+2;
MCNF(ss, tt, f, c);
printf("%d\n", c);
return 0;
}
原文:https://www.cnblogs.com/babydragon/p/11791108.html
内容总结
以上是互联网集市为您收集整理的最新费用流的模板全部内容,希望文章能够帮你解决最新费用流的模板所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。