結果
問題 | No.177 制作進行の宮森あおいです! |
ユーザー | yukicoder |
提出日時 | 2015-04-08 01:28:40 |
言語 | Java21 (openjdk 21) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,456 bytes |
コンパイル時間 | 2,377 ms |
コンパイル使用メモリ | 80,040 KB |
実行使用メモリ | 54,372 KB |
最終ジャッジ日時 | 2024-07-04 10:59:01 |
合計ジャッジ時間 | 7,798 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | WA | - |
testcase_01 | AC | 139 ms
41,880 KB |
testcase_02 | AC | 137 ms
41,520 KB |
testcase_03 | WA | - |
testcase_04 | AC | 164 ms
42,132 KB |
testcase_05 | AC | 186 ms
42,532 KB |
testcase_06 | AC | 197 ms
42,832 KB |
testcase_07 | AC | 158 ms
42,164 KB |
testcase_08 | AC | 178 ms
42,132 KB |
testcase_09 | AC | 203 ms
43,364 KB |
testcase_10 | TLE | - |
testcase_11 | -- | - |
testcase_12 | -- | - |
testcase_13 | -- | - |
testcase_14 | -- | - |
testcase_15 | -- | - |
ソースコード
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); 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 (int i = iter[v]; i < G.get(v).size(); i++) { Edge e = G.get(v).get(i); 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, Integer.MAX_VALUE)) > 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 + 1, 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"); } } }