結果
問題 | No.177 制作進行の宮森あおいです! |
ユーザー |
![]() |
提出日時 | 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");}}}