結果

問題 No.177 制作進行の宮森あおいです!
ユーザー ei1333333ei1333333
提出日時 2015-04-04 15:32:31
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 2 ms / 2,000 ms
コード長 2,296 bytes
コンパイル時間 1,690 ms
コンパイル使用メモリ 152,176 KB
実行使用メモリ 4,380 KB
最終ジャッジ日時 2023-09-17 04:18:33
合計ジャッジ時間 2,142 ms
ジャッジサーバーID
(参考情報)
judge13 / judge11
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
4,380 KB
testcase_01 AC 1 ms
4,376 KB
testcase_02 AC 2 ms
4,376 KB
testcase_03 AC 2 ms
4,376 KB
testcase_04 AC 2 ms
4,376 KB
testcase_05 AC 1 ms
4,376 KB
testcase_06 AC 2 ms
4,380 KB
testcase_07 AC 2 ms
4,380 KB
testcase_08 AC 2 ms
4,376 KB
testcase_09 AC 2 ms
4,380 KB
testcase_10 AC 2 ms
4,380 KB
testcase_11 AC 2 ms
4,376 KB
testcase_12 AC 2 ms
4,376 KB
testcase_13 AC 1 ms
4,380 KB
testcase_14 AC 2 ms
4,380 KB
testcase_15 AC 1 ms
4,380 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#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 150
 
class 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");
}
0