結果
| 問題 |
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 |
ソースコード
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>());
}
}
//fromからtoへ向かう容量capの辺をグラフに追加する。
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));
}
//sからの最短距離をBFSで計算する
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;
}
//sからtへの最大流を求める。
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");
}
}
}
yukicoder