voidadd(int u, int v, int w){ E[u].push_back({ w, v, int(E[v].size()) }); E[v].push_back({ 0, u, int(E[u].size()) - 1 }); }
boolbfs(int s, int t){ queue<int> q; fill(level.begin(), level.end(), 0); fill(curr.begin(), curr.end(), 0); level[s] = 1; q.push(s); while (!q.empty()) { int u = q.front(); q.pop(); for (auto& [w, v, id] : E[u]) { if (w && !level[v]) { level[v] = level[u] + 1; q.push(v); } } } return level[t] > 0; }
intdfs(int u, int t, int maxf){ if (u == t) return maxf; for (int& i = curr[u]; i < E[u].size(); i++) { auto& [w, v, id] = E[u][i]; if (w && (level[v] == level[u] + 1)) { int f = dfs(v, t, min(maxf, w)); if (f) { w -= f; E[v][id][0] += f; curr[u] = i; return f; } } } return0; }
intdinic(int s, int t){ int ans = 0; while (bfs(s, t)) { while (int f = dfs(s, t, 1e9)) { ans += f; } } return ans; } };
#include<bits/stdc++.h> usingnamespace std; #define ll long long #define int ll constint N = 5e4 + 10;
vector<tuple<ll, int, int>> E[N]; int level[N]; int curr[N];
voidadd(int u, int v, ll w){ E[u].push_back({ w, v, E[v].size() }); E[v].push_back({ 0, u, E[u].size() - 1 }); }
boolbfs(int s, int t){ queue<int> q; memset(level, 0, sizeof level); memset(curr, 0, sizeof curr); level[s] = 1; q.push(s); while (!q.empty()) { int u = q.front(); q.pop(); for (auto& [w, v, id] : E[u]) { if (w && !level[v]) { level[v] = level[u] + 1; q.push(v); } } } return level[t] > 0; }
ll dfs(int u, int t, ll maxf){ if (u == t) return maxf; for (int& i = curr[u]; i < E[u].size(); ++i) { auto& [w, v, id] = E[u][i]; if (w && (level[v] == level[u] + 1)) { ll f = dfs(v, t, min(maxf, w)); if (f) { // 有增广路 w -= f; // 正向边减去f get<0>(E[v][id]) += f; // 反向边减去f curr[u] = i; // 更新当前弧 return f; // 返回f } } } return0; // 没有增广路 }
ll dinic(int s, int t){ ll ans = 0; while (bfs(s, t)) { while (ll f = dfs(s, t, 1e18)) { ans += f; } } return ans; }
int n, m; int s = 0, t = 0; int a[N], val[N]; int x[N], y[N], z[N]; signedmain(){ cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> a[i] >> val[i]; } int yyq = val[1]; int yyqmax = 0; ll sum = 0; s = 0, t = n + m + 1; for (int i = 1; i <= m; i++) { cin >> x[i] >> y[i] >> z[i]; sum += z[i];
if (x[i] == 1 || y[i] == 1) { yyq += z[i]; yyqmax = min(yyq, a[1]); } } yyqmax = min(yyq, a[1]); for (int i = 1; i <= m; i++) { add(s, i, z[i]); // 源点到每个菜品的容量 add(i, x[i] + m, z[i]); // 菜品到人的容量 add(i, y[i] + m, z[i]); // 菜品到人的容量 } for (int i = 1; i <= n; i++) { int x = min(a[i], yyqmax - (i != 1)) - val[i]; if (x > 0) { add(i + m, t, x); } if (x < 0) { cout << "NO" << endl; return0; } } if (dinic(s, t) == sum) { cout << "YES" << endl; } else { cout << "NO" << endl; } return0; }
int s = 0; int t = n + m + 1; for (int i = 1; i <= n; i++) { int tmp; cin >> tmp; maxflow.add(s, i, tmp); } ll maxx = 0; for (int i = 1; i <= m; i++) { int u, v, w; cin >> u >> v >> w; maxflow.add(u, n + i, 1e18); maxflow.add(v, n + i, 1e18); maxflow.add(n + i, t, w); maxx += w; }
int s = 0; int t = 2 * n + 1; for (int i = 1; i <= n; i++) { maxflow.add(s, i, 1); maxflow.add(i + n, t, 1); } while (m--) { int x, y; cin >> x >> y; maxflow.add(x, y + n, 1); } maxflow.dinic(s, t);
int cntl = 0, cntr = 0; vector<int> vis(2 * n + 2); auto dfs1 = [&](thisauto&& self, int u) -> void { vis[u] = 1; for (auto [w, v, id] : maxflow.E[u]) { if (vis[v] == 1 || w == 0) continue; if (v >= 1 && v <= n) cntl++; self(v); } return; }; dfs1(s);
fill(vis.begin(), vis.end(), 0); auto dfs2 = [&](thisauto&& self, int u) -> void { vis[u] = 1; for (auto [w, v, id] : maxflow.E[u]) { if (vis[v] == 1 || w != 0) continue; if (n + 1 <= v && v <= n + n) cntr++; self(v); } return; }; dfs2(t);
structMaxMatch { int n, m, dis; vector<vector<int>> E; vector<int> nx, ny, dx, dy, vis;
MaxMatch(int n, int m) : n(n), m(m), dis(0), E(n), nx(n, -1), ny(m, -1), dx(n), dy(m), vis(m) {}
voidadd(int u, int v){ E[u].push_back(v); }
boolbfs(){ dis = inf; fill(dx.begin(), dx.end(), -1); fill(dy.begin(), dy.end(), -1); queue<int> Q; for (int i = 0; i < n; ++i) { if (nx[i] == -1) Q.push(i), dx[i] = 0; } while (!Q.empty()) { int u = Q.front(); Q.pop(); if (dx[u] > dis) break; for (auto v : E[u]) { if (dy[v] == -1) { dy[v] = dx[u] + 1; if (ny[v] == -1) dis = dy[v]; else dx[ny[v]] = dy[v] + 1, Q.push(ny[v]); } } } return dis != inf; }
booldfs(int u){ for (auto v : E[u]) { if (!vis[v] && dy[v] == dx[u] + 1) { vis[v] = true; if (ny[v] != -1 && dy[v] == dis) continue; if (ny[v] == -1 || dfs(ny[v])) { ny[v] = u; nx[u] = v; returntrue; } } } returnfalse; }
intwork(){ int res = 0; while (bfs()) { fill(vis.begin(), vis.end(), false); for (int i = 0; i < n; ++i) { if (nx[i] == -1 && dfs(i)) ++res; } } return res; } };
while (e--) { int u, v; cin >> u >> v; u--, v--; G.add(u, v); } G.work();
vector<vector<pair<int, int>>> E(2 * n + 2); int s = 2 * n, t = 2 * n + 1; for (int u = 0; u < n; ++u) { if (G.nx[u] == -1) { E[s].push_back({ 1, u }); E[u].push_back({ 0, s }); } else { E[s].push_back({ 0, u }); E[u].push_back({ -1, s }); } } for (int v = 0; v < n; ++v) { if (G.ny[v] == -1) { E[v + n].push_back({ 1, t }); E[t].push_back({ 0, v + n }); } else { E[v + n].push_back({ 0, t }); E[t].push_back({ -1, v + n }); } } for (int u = 0; u < n; ++u) { for (auto v : G.E[u]) { if (G.nx[u] == v) { E[u].push_back({ 0, v + n }); E[v + n].push_back({ -1, u }); } else { E[u].push_back({ 1, v + n }); E[v + n].push_back({ 0, u }); } } }
int cntl = 0, cntr = 0; vector<int> vis(2 * n + 2);
auto dfs1 = [&](thisauto&& self, int u) -> void { vis[u] = 1; for (auto [w, v] : E[u]) { if (vis[v] || w == 0) continue; self(v); } return; }; dfs1(2 * n); for (int u = 0; u < n; ++u) { cntl += vis[u]; }
fill(vis.begin(), vis.end(), 0); auto dfs2 = [&](thisauto&& self, int u) -> void { vis[u] = 1; for (auto [w, v] : E[u]) { if (vis[v] || w) continue; self(v); } return; }; dfs2(2 * n + 1); for (int u = n; u < n + n; ++u) { cntr += vis[u]; }
int n; cin >> n; MaxFlow G(n + 62); int s = n + 60, t = n + 61; for (int i = 0; i < n; i++) { ll x; cin >> x; G.add(s, i, 1); for (int bit = 0; bit < 60; bit++) { if (x >> bit & 1) { G.add(i, n + bit, 1e9); } } } for (int bit = 0; bit < 60; bit++) { G.add(n + bit, t, 1); } cout << n - G.dinic(s, t) << "\n";