結果

問題 No.177 制作進行の宮森あおいです!
ユーザー yukicoder
提出日時 2015-04-08 01:37:34
言語 Java
(openjdk 23)
結果
AC  
実行時間 209 ms / 2,000 ms
コード長 3,472 bytes
コンパイル時間 2,418 ms
コンパイル使用メモリ 80,244 KB
実行使用メモリ 43,356 KB
最終ジャッジ日時 2024-07-04 10:59:21
合計ジャッジ時間 5,673 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 13
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

import java.util.*;
class MaxFlow {
//
class Edge {
int to;
int cap;
int rev;
public Edge(int to, int cap, int rev) {
this.to = to;
this.cap = cap;
this.rev = rev;
}
}
final int MAX_V = 1000;
//
ArrayList<ArrayList<Edge>> G = new ArrayList<>();
//s
int[] level = new int[MAX_V];
//調
int[] iter = new int[MAX_V];
public MaxFlow() {
for (int i = 0; i < MAX_V; i++) {
G.add(new ArrayList<Edge>());
}
}
//fromtocap
void addEdge(int from, int to, int cap) {
G.get(from).add(new Edge(to, cap, G.get(to).size()));
G.get(to).add(new Edge(from, 0, G.get(from).size() - 1));
}
//sBFS
void bfs(int s) {
Arrays.fill(this.level, -1);
Queue<Integer> queue = new LinkedList<>();
queue.add(s);
this.level[s] = 0;
while (queue.size() > 0) {
int v = queue.poll();
for (Edge e : G.get(v)) {
if (e.cap > 0 && level[e.to] < 0) {
level[e.to] = level[v] + 1;
queue.add(e.to);
}
}
}
}
//DFS
int dfs(int v, int t, int f) {
if (v == t) return f;
for (; iter[v] < G.get(v).size(); iter[v]++) {
Edge e = G.get(v).get(iter[v]);
if (e.cap > 0 && level[v] < level[e.to]) {
int d = dfs(e.to, t, Math.min(f, e.cap));
if (d > 0) {
e.cap -= d;
G.get(e.to).get(e.rev).cap += d;
return d;
}
}
}
return 0;
}
//st
int max_flow(int s, int t) {
int flow = 0;
while (true) {
bfs(s);
if (level[t] < 0) return flow;
Arrays.fill(iter, 0);
int f;
while ((f = dfs(s, t, 1 << 30)) > 0) {
flow += f;
}
}
}
}
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int W = scanner.nextInt();
int N = scanner.nextInt();
MaxFlow flow = new MaxFlow();
for (int i = 0; i < N; i++) {
int J = scanner.nextInt();
flow.addEdge(0, i + 1, J);
}
int M = scanner.nextInt();
for (int i = 0; i < M; i++) {
int C = scanner.nextInt();
flow.addEdge(100 + i, 200, C);
}
for (int i = 0; i < M; i++) {
int Q = scanner.nextInt();
boolean[] check = new boolean[N + 1];
for (int j = 0; j < Q; j++) {
int X = scanner.nextInt();
check[X] = true;
}
for (int j = 1; j < N + 1; j++) {
if (!check[j]) {
flow.addEdge(j, 100 + i, 1 << 30);
}
}
}
int ans = flow.max_flow(0, 200);
System.err.println(ans);
if (ans >= W) {
System.out.println("SHIROBAKO");
} else {
System.out.println("BANSAKUTSUKITA");
}
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0