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
| #include <bits/stdc++.h> #define rei register int #define N 100010 using namespace std; typedef long long ll; const int inf = 1e9;
template <typename T> inline void read(T &x) { x = 0; T f = 1; char ch = getchar(); while (!isdigit(ch)) {if (ch == '-') f = -f; ch = getchar();} while (isdigit(ch)) {x = x * 10 + ch - 48; ch = getchar();} x *= f; }
int n, m, st, ed, head[N], edge_cnt = 1, incf[N], dis[N], pre[N], vis[N], maxflow, mincost; struct edge {int nxt, v, w, c;} e[N << 1];
inline void add_edge(int u, int v, int w, int c) {e[++edge_cnt].nxt = head[u]; head[u] = edge_cnt; e[edge_cnt].v = v; e[edge_cnt].w = w; e[edge_cnt].c = c;}
inline bool SPFA() { queue<int> q; memset(dis, 0x3f, sizeof(dis)); memset(vis, 0, sizeof(vis)); dis[st] = 0; q.push(st); vis[st] = 1; incf[st] = inf; while (!q.empty()) { int u = q.front(); q.pop(); vis[u] = 0; for (rei i = head[u]; i; i = e[i].nxt) { int v = e[i].v; if (dis[u] + e[i].c < dis[v] && e[i].w) { dis[v] = dis[u] + e[i].c; incf[v] = min(incf[u], e[i].w); pre[v] = i; if (!vis[v]) q.push(v), vis[v] = 1; } } } return dis[ed] != 1061109567; }
inline void MCMF() { while (SPFA()) { int x = ed; maxflow += incf[ed]; mincost += dis[ed] * incf[ed]; int i; while (x != st) { i = pre[x]; e[i].w -= incf[ed]; e[i ^ 1].w += incf[ed]; x = e[i ^ 1].v; } } }
int main() { read(n); read(m); read(st); read(ed); for (rei i = 1; i <= m; i++) { int u, v, c, w; read(u); read(v); read(w); read(c); add_edge(u, v, w, c); add_edge(v, u, 0, -c); } MCMF(); printf("%d %d", maxflow, mincost); return 0; }
|