結果
問題 | No.177 制作進行の宮森あおいです! |
ユーザー |
![]() |
提出日時 | 2015-04-02 23:46:07 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 4,461 bytes |
コンパイル時間 | 1,585 ms |
コンパイル使用メモリ | 173,656 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-07-04 01:28:10 |
合計ジャッジ時間 | 2,226 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 13 |
ソースコード
#include <bits/stdc++.h>#define rep(i, n) for (int (i) = 0; (i) < (int)(n); (i)++)#define SZ(a) ((int)((a).size()))#define NG -1const int dx[] = {1, 0, -1, 0};const int dy[] = {0, 1, 0, -1};using namespace std;typedef long long ll;class Dinic{public:Dinic(int input_maxv) : maxv(input_maxv){G.resize(input_maxv);level.resize(input_maxv);iter.resize(input_maxv);}void add_edge_both(int from, int to, int cap){const int rev_from = SZ(G[from]);const int rev_to = SZ(G[to]);G[from].push_back(edge(to,cap,rev_to));G[to].push_back(edge(from,cap,rev_from));}void add_edge(int from, int to, int cap){const int rev_from = SZ(G[from]);const int rev_to = SZ(G[to]);G[from].push_back(edge(to,cap,rev_to));G[to].push_back(edge(from,0,rev_from));}int max_flow(int s, int t){int flow = 0;for(;;){bfs(s);if(level[t]<0) break;fill(iter.begin(),iter.end(),0);int f;while( (f=dfs(s,t,DINIC_INF))>0){flow += f;}}return flow;}vector <bool> get_nodes_in_group(int s){vector <bool> ret(maxv);queue<int> que;que.push(s);while(!que.empty()){int v = que.front();que.pop();ret[v]=true;for(int i=0;i<SZ(G[v]);i++){edge &e = G[v][i];if(e.cap>0 && !ret[e.to]){que.push(e.to);}}}return ret;}void disp(){for (int v = 0; v < maxv; v++){printf("%d:",v);for(int i=0;i<SZ(G[v]);i++){if(G[v][i].init_cap>0){printf("->%d(%d),",G[v][i].to,G[v][i].init_cap);}}printf("\n");}}private:void bfs(int s){fill(level.begin(),level.end(),NG);queue<int> que;level[s]=0;que.push(s);while(!que.empty()){int v = que.front();que.pop();for(int i=0;i<SZ(G[v]);i++){edge &e = G[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<SZ(G[v]);i++){edge& e = G[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;G[e.to][e.rev].cap += d;return d;}}}return 0;}static const int DINIC_INF = INT_MAX;struct edge{edge(int input_to, int input_cap, int input_rev) : to(input_to), cap(input_cap), rev(input_rev), init_cap(input_cap) {}int to;int cap;int rev;int init_cap;};int maxv;vector < vector <edge> > G;vector < int > level;vector < int > iter;};const int MAXN = 64, MAXM = 64;int J[MAXN];int C[MAXM];bool ng[MAXM][MAXN];int main() {int W, N, M;cin >> W;cin >> N;for (int i = 0; i < N; i++) cin >> J[i];cin >> M;for (int i = 0; i < M; i++) cin >> C[i];for (int i = 0; i < M; i++) {int q;cin >> q;for (int j = 0; j < q; j++) {int x;cin >> x;x--;ng[i][x] = true;}}int s = N+M+1, t = s+1, V = t+1;Dinic *dinic = new Dinic(V);for (int i = 0; i < N; i++) {dinic->add_edge(s, i, J[i]);}for (int i = 0; i < M; i++) {dinic->add_edge(i+N, t, C[i]);for (int j = 0; j < N; j++) {if (!ng[i][j]) {dinic->add_edge(j, i+N, J[j]);}}}int tmp = dinic->max_flow(s, t);string ans;if (tmp >= W) ans = "SHIROBAKO";else ans = "BANSAKUTSUKITA";cout << ans << endl;return 0;}