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
", c);
return 0;
}