1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| #include <cstdio> #include <queue> #include <cstring>
const int INF = 1e9; inline int min(const int x, const int y) {return x < y ? x : y;} struct Edge { int to, nxt, cap, cost; } e[50005]; int head[3005], cur[3005], dis[3005], tot, s, t, n, m; bool mark[3005], vis[3005]; std::queue<int> Q; inline void AddEdge(const int u, const int v, const int cap, const int cost) { e[++ tot].to = v, e[tot].nxt = head[u], head[u] = tot; e[tot].cap = cap, e[tot].cost = cost; e[++ tot].to = u, e[tot].nxt = head[v], head[v] = tot; e[tot].cap = 0, e[tot].cost = -cost; }
bool SPFA() { memcpy(cur, head, sizeof cur); memset(dis, 0x3f, sizeof dis); memset(mark, 0, sizeof mark); memset(vis, 0, sizeof vis); dis[s] = 0; Q.push(s); while (Q.size()) { int u(Q.front()); Q.pop(); mark[u] = false; for (int i(head[u]); i; i = e[i].nxt) { int v(e[i].to); if (e[i].cap && dis[u] + e[i].cost < dis[v]) { dis[v] = dis[u] + e[i].cost; if (!mark[v]) Q.push(v), mark[v] = true; } } } return dis[t] <= INF; }
int dfs(int u, int low) { if (u == t) return low; vis[u] = true; int res(0), flow(0); for (int i(cur[u]); i; i = e[i].nxt) { cur[u] = i; if (e[i].cap && low && dis[u] + e[i].cost == dis[e[i].to] && !vis[e[i].to]) if (flow = dfs(e[i].to, min(low, e[i].cap))) { e[i].cap -= flow, e[i ^ 1].cap += flow; res += flow, low -= flow; } } return res; }
int Dinic() { int Mincost(0); while (SPFA()) Mincost += dis[t] * dfs(s, INF); return Mincost; }
int main() { while (scanf("%d%d", &n, &m) == 2) { tot = 1; memset(head, 0, sizeof head); for (int i(1); i <= m; ++ i) { int u, v, w; scanf("%d%d%d", &u, &v, &w); AddEdge(2 * u, 2 * v - 1, 1, w); } for (int i(2); i < n; ++ i) AddEdge(2 * i - 1, 2 * i, 1, 0); AddEdge(1, 2, 2, 0), AddEdge(2 * n - 1, 2 * n, 2, 0); AddEdge(s = 0, 1, 2, 0); AddEdge(2 * n, t = 2 * n + 1, 2, 0); printf("%d\n", Dinic()); } }
|