結果
問題 |
No.3201 Corporate Synergy
|
ユーザー |
![]() |
提出日時 | 2025-07-12 12:30:56 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,551 bytes |
コンパイル時間 | 1,311 ms |
コンパイル使用メモリ | 77,276 KB |
実行使用メモリ | 7,844 KB |
最終ジャッジ日時 | 2025-07-12 12:30:59 |
合計ジャッジ時間 | 2,150 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 10 WA * 10 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:132:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 132 | scanf("%d", &n); | ~~~~~^~~~~~~~~~ main.cpp:133:36: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 133 | for (int i = 0; i < n; i++) scanf("%d", ps + i); | ~~~~~^~~~~~~~~~~~~~ main.cpp:136:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 136 | scanf("%d", &m); | ~~~~~^~~~~~~~~~ main.cpp:139:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 139 | scanf("%d%d", &u, &v); | ~~~~~^~~~~~~~~~~~~~~~ main.cpp:145:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 145 | scanf("%d", &k); | ~~~~~^~~~~~~~~~ main.cpp:148:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 148 | scanf("%d%d%d", &u, &v, &s); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~
ソースコード
/* -*- coding: utf-8 -*- * * 3201.cc: No.3201 Corporate Synergy - yukicoder */ #include<cstdio> #include<vector> #include<queue> #include<algorithm> #include<utility> #include<tuple> using namespace std; /* constant */ const int MAX_N = 200; const int MAX_M = 200; const int MAX_K = 200; const long long LINF = 1LL << 60; /* typedef */ using ll = long long; using pii = pair<int,int>; using tp3 = tuple<int,int,int>; template <typename T> struct MaxFlow { using pii = pair<int,int>; using vpii = vector<pii>; using vvpii = vector<vpii>; int n, m; vvpii nbrs; T inf, max_flow; vpii prvs; vector<T> minfs, caps, flows; MaxFlow(int _n, T _inf): n(_n), m(0), inf(_inf) { nbrs.assign(n, vpii()); minfs.assign(n, 0); prvs.assign(n, {-1, -1}); caps.clear(), flows.clear(); max_flow = 0; } int addedges(int u, int v, T c) { // edge[m]: u -> v, cap=c nbrs[u].push_back({v, m}); caps.push_back(c); flows.push_back(0); // edge[m + 1]: v -> u, cap=0 nbrs[v].push_back({u, m + 1}); caps.push_back(0); flows.push_back(0); m += 2; return m; } T flow(int st, int gl, bool cont = false) { if (! cont) { fill(flows.begin(), flows.end(), 0); max_flow = 0; } for (;;) { //printf("max_flow = %d, limit = %d\n", max_flow, limit); fill(prvs.begin(), prvs.end(), pii(-1, -1)); prvs[st] = {st, -1}; minfs[st] = inf; queue<int> q; q.push(st); while (! q.empty()) { int u = q.front(); q.pop(); if (u == gl) break; for (auto [v, ei]: nbrs[u]) { T vc = caps[ei] - flows[ei]; if (prvs[v].first < 0 && vc > 0) { prvs[v] = {u, ei}; minfs[v] = (minfs[u] < vc) ? minfs[u] : vc; q.push(v); } } } if (prvs[gl].first < 0) break; T min_flow = minfs[gl]; for (int j = gl; j != st;) { auto [i, ei] = prvs[j]; flows[ei] += min_flow; flows[ei ^ 1] -= min_flow; j = i; } max_flow += min_flow; } return max_flow; } }; /* int main() { const int INF = 1 << 30; MaxFlow<int> mf(3, INF); mf.addedges(0, 1, 1); mf.addedges(1, 2, 3); mf.addedges(0, 2, 1); int f = mf.flow(0, 2); printf("f=%d\n", f); return 0; } */ /* global variables */ int ps[MAX_N]; pii es[MAX_M]; tp3 sgs[MAX_K]; bool used[MAX_N]; /* subroutines */ /* main */ int main() { int n; scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", ps + i); int m; scanf("%d", &m); for (int i = 0; i < m; i++) { int u, v; scanf("%d%d", &u, &v); u--, v--; es[i] = {u, v}; } int k; scanf("%d", &k); for (int i = 0; i < k; i++) { int u, v, s; scanf("%d%d%d", &u, &v, &s); u--, v--; sgs[i] = {u, v, s}; } int st = n + k, gl = st + 1, gn = gl + 1; MaxFlow<ll> mf(gn, LINF); for (int u = 0; u < n; u++) { if (ps[u] > 0) mf.addedges(st, u, ps[u]); else if (ps[u] < 0) mf.addedges(u, gl, -ps[u]); } for (int i = 0; i < m; i++) { auto [u, v] = es[i]; mf.addedges(v, u, LINF); } for (int i = 0; i < k; i++) { auto [u, v, s] = sgs[i]; int w = n + i; mf.addedges(st, w, s); mf.addedges(w, u, LINF); mf.addedges(w, v, LINF); } ll f = mf.flow(st, gl); //printf(" f=%lld\n", f); for (int u = 0; u < n; u++) if (mf.minfs[u]) used[u] = true; ll sum = 0; for (int u = 0; u < n; u++) if (used[u]) sum += ps[u]; for (int i = 0; i < k; i++) { auto [u, v, s] = sgs[i]; if (used[u] && used[v]) sum += s; } printf("%lld\n", sum); return 0; }