結果

問題 No.177 制作進行の宮森あおいです!
ユーザー autotaker1984
提出日時 2015-07-18 14:23:54
言語 Java
(openjdk 23)
結果
AC  
実行時間 298 ms / 2,000 ms
コード長 2,727 bytes
コンパイル時間 2,036 ms
コンパイル使用メモリ 78,616 KB
実行使用メモリ 46,988 KB
最終ジャッジ日時 2024-07-08 10:10:29
合計ジャッジ時間 5,863 ms
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 13
権限があれば一括ダウンロードができます

ソースコード

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

import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int W = in.nextInt();
int N = in.nextInt();
int[] js = new int[N];
for( int i = 0; i < N; i++ ) js[i] = in.nextInt();
int M = in.nextInt();
int[] cs = new int[M];
for( int i = 0; i < M; i++ ) cs[i] = in.nextInt();
MaxFlow f = new MaxFlow(2 + M + N);
for( int i = 0; i < N; i++ ) f.addEdge(0, 1 + i, js[i]);
for( int i = 0; i < M; i++ ) {
f.addEdge(1 + N + i, M + N + 1, cs[i]);
int q = in.nextInt();
boolean[] bad = new boolean[N];
for( int j = 0; j < q; j++ ) {
bad[in.nextInt()-1] = true;
}
for( int j = 0; j < N; j++ ) {
if( !bad[j] ) f.addEdge( 1 + j, 1 + N + i, W );
}
}
int flow = f.run( 0, M+N+1);
// System.out.println("flow: " + flow);
if( flow >= W ) {
System.out.println("SHIROBAKO");
}else {
System.out.println("BANSAKUTSUKITA");
}
}
}
class Edge {
int from;
int to;
int cap;
Edge rev;
public Edge( int from, int to, int cap ) {
this.from = from;
this.to = to;
this.cap = cap;
}
}
class MaxFlow {
int N;
ArrayList<ArrayList<Edge>> g;
ArrayList<Edge> edges;
public MaxFlow(int N) {
this.N = N;
this.g = new ArrayList<ArrayList<Edge>>();
this.edges = new ArrayList<Edge>();
for( int i = 0; i < N; i++ ) {
this.g.add(new ArrayList<Edge>());
}
}
public void addEdge( int from, int to, int cap ) {
Edge e1 = new Edge( from, to, cap );
Edge e2 = new Edge( to, from, 0 );
e1.rev = e2;
e2.rev = e1;
g.get(from).add(e1);
g.get(to).add(e2);
}
public int run( int src, int sink ) {
int flow = 0;
while( true ) {
boolean[] vis = new boolean[N];
LinkedList<Edge> path = new LinkedList<Edge>();
boolean b = dfs(vis, path, src, sink );
if( !b ) break;
int cap = Integer.MAX_VALUE;
for( Edge e : path ) cap = Math.min(e.cap,cap);
flow += cap;
/*
System.out.println("cap : " + cap);
System.out.print("path :" + src);
*/
for( Edge e : path ) {
//System.out.print(" " + e.to);
e.cap -= cap;
e.rev.cap += cap;
}
//System.out.println();
}
return flow;
}
private boolean dfs(boolean[] vis, LinkedList<Edge> path, int v, int t ) {
if( v == t ) return true;
if( vis[v] ) return false;
vis[v] = true;
for( Edge e : g.get(v) ) {
if( !vis[e.to] && e.cap > 0) {
path.add(e);
if( dfs(vis, path, e.to, t) ) {
return true;
}
path.removeLast();
}
}
return false;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0