結果
問題 | No.177 制作進行の宮森あおいです! |
ユーザー |
![]() |
提出日時 | 2015-04-04 15:32:31 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 2,296 bytes |
コンパイル時間 | 1,586 ms |
コンパイル使用メモリ | 168,956 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-07-04 01:52:15 |
合計ジャッジ時間 | 1,973 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 13 |
ソースコード
#include<bits/stdc++.h>using namespace std;#define rep(i,n) for(int i = 0; i < n; i++)typedef long long int64;const int INF = 1 << 30;typedef pair< int , int > Pi;#define MAX_V 150class Dinic{private:struct edge{ // (行き先, 容量, 逆辺のindex)int to, cap, rev;edge(int to, int cap, int rev):to(to), cap(cap), rev(rev){};};vector< edge > info[MAX_V];int level[MAX_V]; //sからの距離int iter[MAX_V]; //どこまで調べ終わったかpublic:Dinic(){}void add_edge(int from, int to, int cap){info[from].push_back( edge( to, cap, info[to].size()));info[to].push_back( edge( from, 0, info[from].size() - 1));}void bfs(int s){memset( level, -1, sizeof level);queue< int > que;level[s] = 0;que.push( s);while(!que.empty()){int v = que.front(); que.pop();for(int i = 0; i < info[v].size(); i++){edge& e = info[v][i];if(e.cap > 0 && level[e.to] < 0){level[e.to] = level[v] + 1;que.push(e.to);}}}}int dfs(int v, int t, int f){if(v == t) return f;for(int& i = iter[v]; i < info[v].size(); i++){edge& e = info[v][i];if(e.cap > 0 && level[v] < level[e.to]){int d = dfs(e.to, t, min( f, e.cap));if(d > 0){e.cap -= d;info[e.to][e.rev].cap += d;return d;}}}return 0;}int max_flow(int s, int t){int flow = 0;while(true){bfs(s);if(level[t] < 0) return flow;memset( iter, 0, sizeof iter);int f;while((f = dfs( s, t, INF)) > 0){flow += f;}}}};int main() {int W, N, J[50], M, C[50];bool Flag[50][50] = {{}};Dinic dinic;cin >> W >> N;rep(i, N) cin >> J[i];cin >> M;rep(i, M) cin >> C[i];int S = N + M, G = N + M + 1;rep(i, N) dinic.add_edge(S, i, J[i]);rep(i, M) dinic.add_edge(i + N, G, C[i]);rep(i, M) {int Q;cin >> Q;rep(j, Q) {int X;cin >> X;--X;Flag[X][i] = true;}}rep(i, N) {rep(j, M) {if(!Flag[i][j]) dinic.add_edge(i, j + N, INF);}}int Flow = dinic.max_flow(S, G);if(Flow >= W) puts("SHIROBAKO");else puts("BANSAKUTSUKITA");}