結果
問題 | No.177 制作進行の宮森あおいです! |
ユーザー | yukicoder |
提出日時 | 2015-04-08 01:37:34 |
言語 | Java21 (openjdk 21) |
結果 |
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 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 151 ms
41,456 KB |
testcase_01 | AC | 146 ms
41,544 KB |
testcase_02 | AC | 134 ms
41,788 KB |
testcase_03 | AC | 153 ms
41,696 KB |
testcase_04 | AC | 165 ms
41,664 KB |
testcase_05 | AC | 186 ms
42,384 KB |
testcase_06 | AC | 192 ms
42,724 KB |
testcase_07 | AC | 177 ms
41,816 KB |
testcase_08 | AC | 180 ms
42,188 KB |
testcase_09 | AC | 205 ms
43,224 KB |
testcase_10 | AC | 209 ms
43,260 KB |
testcase_11 | AC | 190 ms
43,356 KB |
testcase_12 | AC | 205 ms
43,220 KB |
testcase_13 | AC | 133 ms
41,356 KB |
testcase_14 | AC | 136 ms
41,284 KB |
testcase_15 | AC | 135 ms
41,292 KB |
ソースコード
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"); } } }