結果
問題 | No.177 制作進行の宮森あおいです! |
ユーザー |
|
提出日時 | 2020-09-04 15:51:50 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 15 ms / 2,000 ms |
コード長 | 3,204 bytes |
コンパイル時間 | 1,333 ms |
コンパイル使用メモリ | 90,680 KB |
最終ジャッジ日時 | 2025-01-14 04:29:13 |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 13 |
ソースコード
#include <iostream>#include <vector>#include <queue>#include <limits>template <class Cap, bool isDirect>struct MaxFlow {struct Edge {int src, dst;Cap cap;Edge(int src, int dst, Cap cap): src(src), dst(dst), cap(cap){};};using Edges = std::vector<Edge>;using Graph = std::vector<std::vector<int>>;Edges edges;Graph graph;std::vector<int> dist, iter;explicit MaxFlow(int n): graph(n), dist(n), iter(n) {}void span(int u, int v, Cap cap) {graph[u].push_back(edges.size());edges.emplace_back(u, v, cap);graph[v].push_back(edges.size());edges.emplace_back(v, u, (isDirect ? 0 : cap));}void bfs(int s) {std::fill(dist.begin(), dist.end(), -1);dist[s] = 0;std::queue<int> que;que.push(s);while (!que.empty()) {int v = que.front();que.pop();for (int eidx : graph[v]) {const auto& edge = edges[eidx];if (edge.cap > 0 && dist[edge.dst] < 0) {dist[edge.dst] = dist[v] + 1;que.push(edge.dst);}}}}int dfs(int v, int g, Cap f) {if (v == g) return f;for (int& itr = iter[v]; itr < (int)graph[v].size(); ++itr) {int eidx = graph[v][itr];auto& edge = edges[eidx];if (edge.cap > 0 && dist[v] < dist[edge.dst]) {Cap df = dfs(edge.dst, g, std::min(f, edge.cap));if (df > 0) {edge.cap -= df;auto& redge = edges[eidx ^ 1];redge.cap += df;return df;}}}return 0;}Cap exec(int s, int g) {const Cap INF = std::numeric_limits<Cap>::max();Cap ret = 0;while (true) {bfs(s);if (dist[g] < 0) return ret;std::fill(iter.begin(), iter.end(), 0);while (true) {Cap flow = dfs(s, g, INF);if (flow == 0) break;ret += flow;}}}};void solve() {int w;std::cin >> w;int n;std::cin >> n;std::vector<int> xs(n);for (auto& x : xs) std::cin >> x;int m;std::cin >> m;std::vector<int> ys(m);for (auto& y : ys) std::cin >> y;int s = n + m, g = n + m + 1;MaxFlow<int, true> mf(n + m + 2);for (int i = 0; i < n; ++i) mf.span(s, i, xs[i]);for (int j = 0; j < m; ++j) mf.span(n + j, g, ys[j]);for (int j = 0; j < m; ++j) {std::vector<bool> ok(n, true);int q;std::cin >> q;while (q--) {int i;std::cin >> i;ok[--i] = false;}for (int i = 0; i < n; ++i) {if (ok[i]) mf.span(i, n + j, w);}}std::cout << (mf.exec(s, g) >= w ? "SHIROBAKO" : "BANSAKUTSUKITA")<< "\n";}int main() {std::cin.tie(nullptr);std::ios::sync_with_stdio(false);solve();return 0;}