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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| #include<bits/stdc++.h> using namespace std;
#define dbg(x...) do { cout << #x << " -> "; err(x); } while (0) void err () { cout << endl;} template <class T, class... Ts> void err(const T& arg, const Ts&... args) { cout << arg << ' '; err(args...);}
inline int rd() { int s = 0, w = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') w = -1; ch = getchar();} while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar(); return s * w; }
inline void _max (int& a, int b) { if (a < b) a = b; } inline void _min (int& a, int b) { if (a > b) a = b; }
typedef long long ll; const int inf = 0x3f3f3f3f; const int maxn = 1e3 + 10; const int maxm = 4e4 + 10;
int cnt, head[maxn]; struct edge { int v, w, next; } e[maxm];
inline void add (int u, int v, int w) { e[cnt] = {v, w, head[u]}, head[u] = cnt++; }
inline void addedge (int u, int v, int w) { add(u, v, w), add(v, u, 0); }
int s, t; int dep[maxn]; bool bfs () { memset(dep, 0, sizeof dep); queue<int> Q; Q.emplace(s); dep[s] = 1; while (Q.size()) { int u = Q.front(); Q.pop(); for (int i = head[u]; ~i; i = e[i].next) { int v = e[i].v, w = e[i].w; if (0 == dep[v] && w > 0) { dep[v] = dep[u] + 1; Q.emplace(v); } } } return dep[t] > 0; }
int cur[maxn]; int dfs (int u, int flow) { if (u == t) return flow; for (int& i = cur[u]; ~i; i = e[i].next) { int v = e[i].v, w = e[i].w; if (dep[v] == dep[u] + 1 && w) { int minflow = dfs(v, min(flow, w)); if (minflow > 0) { e[i].w -= minflow; e[i ^ 1].w += minflow; return minflow; } } } return 0; }
int dinic () { int ans = 0; while (bfs()) { for (int i = 1; i <= t; ++i) cur[i] = head[i]; while (int d = dfs(s, inf)) ans += d; } return ans; }
void run () { int n = rd(), m = rd(), k = rd(); s = 2 * n + 1, t = s + 1; cnt = 0; memset(head, -1, sizeof head); for (int i = 1; i <= m; ++i) { int u = rd(), v = rd(), w = rd(); addedge(2 * u, 2 * v - 1, w); } for (int i = 1; i <= n; ++i) addedge(s, 2 * i - 1, rd() ); for (int i = 1; i <= n; ++i) addedge(2 * i - 1, 2 * i, rd() ); add(2 * k, t, inf); printf("%d\n", dinic());
}
int main () {
int _ = 1;
_ = rd();
while (_--) run();
return 0; }
|