結果

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

ソースコード

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