結果
問題 | No.177 制作進行の宮森あおいです! |
ユーザー | pianoneko |
提出日時 | 2019-03-08 13:29:14 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 3 ms / 2,000 ms |
コード長 | 3,398 bytes |
コンパイル時間 | 2,131 ms |
コンパイル使用メモリ | 181,624 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-23 15:00:35 |
合計ジャッジ時間 | 2,664 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,816 KB |
testcase_01 | AC | 2 ms
6,940 KB |
testcase_02 | AC | 2 ms
6,944 KB |
testcase_03 | AC | 2 ms
6,940 KB |
testcase_04 | AC | 2 ms
6,944 KB |
testcase_05 | AC | 2 ms
6,944 KB |
testcase_06 | AC | 2 ms
6,940 KB |
testcase_07 | AC | 2 ms
6,944 KB |
testcase_08 | AC | 2 ms
6,940 KB |
testcase_09 | AC | 3 ms
6,944 KB |
testcase_10 | AC | 2 ms
6,940 KB |
testcase_11 | AC | 3 ms
6,944 KB |
testcase_12 | AC | 2 ms
6,940 KB |
testcase_13 | AC | 1 ms
6,944 KB |
testcase_14 | AC | 2 ms
6,940 KB |
testcase_15 | AC | 2 ms
6,944 KB |
ソースコード
#include <bits/stdc++.h> #define REP(i, n) for (int i = 0; i < n; i++) #define llINF ((long long)1e18) #define iINF ((int)1e9) #define ALL(obj) obj.begin(), obj.end() using namespace std; template <typename T> struct Edge { int rev, from, to; T cap, icap; Edge(int rev, int from, int to, T cap) : rev(rev), from(from), to(to), cap(cap), icap(cap) {} }; template <typename T> struct Graph { vector<vector<Edge<T>>> list; Graph(int n = 0) : list(n) {} void init(int n = 0) { list.clear(); list.resize(n); } inline vector<Edge<T>> &operator[](int i) { return list[i]; } inline const size_t size() const { return list.size(); } inline Edge<T> &redge(Edge<T> e) { if (e.from != e.to) return list[e.to][e.rev]; else return list[e.to][e.rev + 1]; } void addEdge(int from, int to, T cap) { list[from].push_back(Edge<T>((int)list[to].size(), from, to, cap)); list[to].push_back(Edge<T>((int)list[from].size() - 1, to, from, 0)); } }; template <typename T> struct Dinic { const T INF = 1 << 30; vector<int> level, iter; Dinic() {} void bfs(Graph<T> &graph, int s) { level.assign((int)graph.size(), -1); level[s] = 0; queue<int> que; que.push(s); while (!que.empty()) { int v = que.front(); que.pop(); for (int i = 0; i < graph[v].size(); i++) { Edge<T> &e = graph[v][i]; if (level[e.to] < 0 && e.cap > 0) { level[e.to] = level[v] + 1; que.push(e.to); } } } } T dfs(Graph<T> &graph, int v, int t, T f) { if (v == t) return f; for (int &i = iter[v]; i < graph[v].size(); i++) { Edge<T> &e = graph[v][i], &re = graph.redge(e); if (level[v] < level[e.to] && e.cap > 0) { T d = dfs(graph, e.to, t, min(f, e.cap)); if (d > 0) { e.cap -= d; re.cap += d; return d; } } } return 0; } T solve(Graph<T> &graph, int s, int t) { level.assign((int)graph.size(), -1); iter.assign((int)graph.size(), 0); T res = 0; for (;;) { bfs(graph, s); if (level[t] < 0) return res; for (int i = 0; i < (int)iter.size(); i++) iter[i] = 0; T flow = 0; while ((flow = dfs(graph, s, t, INF)) > 0) { res += flow; } } } }; int main() { int W, N, M; cin >> W >> N; vector<int> J(N); REP(i, N) { cin >> J[i]; } cin >> M; vector<int> C(M); REP(i, M) { cin >> C[i]; } Graph<int> graph(110); REP(m, M) { int Q; cin >> Q; vector<bool> connect(N, true); REP(_, Q) { int X; cin >> X; connect[X - 1] = false; } REP(n, N) { if (!connect[n]) continue; graph.addEdge(n, N + m, iINF); } } REP(n, N) { graph.addEdge(N + M, n, J[n]); } REP(m, M) { graph.addEdge(N + m, N + M + 1, C[m]); } Dinic<int> dinic; cout << (dinic.solve(graph, N + M, N + M + 1) >= W ? "SHIROBAKO" : "BANSAKUTSUKITA") << endl; }