hdu 6118(费用流)
裸的费用流 因为没有负环 因此可以建图 不需要跑最大流 所以在费用为正的时候return就行了
#include <cstdio> #include <cmath> #include <cstring> #include <iostream> #include <algorithm> #include <cstdlib> #include <queue> #include <vector> using namespace std; struct Edge { long long from, to; long long cap, flow, cost; }; const int maxn = 505 * 4 + 5; const long long INF = 0x7fffffffffffffff; long long a[505], b[505], c[505], d[505]; long long g[505][505]; struct MCMF { long long n, m, s, t; vector<Edge> edges; vector<long long> G[maxn]; long long inq[maxn], d[maxn], p[maxn], a[maxn]; void init(long long n) { this->n = n; for(int i = 0; i < n; ++i) G[i].clear(); edges.clear(); } void AddEdge(long long from, long long to, long long cap, long long cost) { edges.push_back((Edge) { from, to, cap, 0, cost }); edges.push_back((Edge) { to, from, 0, 0, -cost }); m = edges.size(); G[from].push_back(m - 2); G[to].push_back(m - 1); } bool BellmanFord(long long s, long long t, long long &flow, long long &cost) { for(int i = 0; i < n; ++i) d[i] = INF; memset(inq, 0, sizeof(inq)); d[s] = 0; inq[s] = 1; p[s] = 0; a[s] = INF; queue<long long> Q; Q.push(s); while(!Q.empty()) { long long u = Q.front(); Q.pop(); inq[u] = 0; for(int i = 0; i < G[u].size(); ++i) { Edge &e = edges[G[u][i]]; if(e.cap > e.flow && d[e.to] > d[u] + e.cost) { d[e.to] = d[u] + e.cost; p[e.to] = G[u][i]; a[e.to] = min(a[u], e.cap - e.flow); if(!inq[e.to]) { Q.push(e.to); inq[e.to] = 1; } } } } if(d[t] >= 0) return false; flow += a[t]; cost += d[t] * a[t]; long long u = t; while(u != s) { edges[p[u]].flow += a[t]; edges[p[u] ^ 1].flow -= a[t]; u = edges[p[u]].from; } return true; } long long Mincost(long long s, long long t) { long long flow = 0, cost = 0; while(BellmanFord(s, t, flow, cost)) { }; return cost; } } mcmf; int main() { long long n, m; while(~scanf("%I64d%I64d", &n, &m)) { memset(g, -1, sizeof(g)); for(int i = 1; i <= n; ++i) { scanf("%I64d%I64d%I64d%I64d", &a[i], &b[i], &c[i], &d[i]); g[i][i] = 0; } mcmf.init(n + 2); for(int i = 0; i < m; ++i) { long long u, v, k; scanf("%I64d%I64d%I64d", &u, &v, &k); mcmf.AddEdge(u, v, INF, k); mcmf.AddEdge(v, u, INF, k); } for(int i = 1; i <= n; ++i) { mcmf.AddEdge(0, i, b[i], a[i]); mcmf.AddEdge(i, n + 1, d[i], -c[i]); } long long ans = -mcmf.Mincost(0, n + 1); printf("%I64d\n", ans); } }

浙公网安备 33010602011771号