結果

問題 No.177 制作進行の宮森あおいです!
ユーザー Mister
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#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;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0