結果
| 問題 |
No.119 旅行のツアーの問題
|
| コンテスト | |
| ユーザー |
schwarzahl
|
| 提出日時 | 2017-12-23 00:02:15 |
| 言語 | Java (openjdk 23) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,318 bytes |
| コンパイル時間 | 2,502 ms |
| コンパイル使用メモリ | 77,724 KB |
| 実行使用メモリ | 56,752 KB |
| 最終ジャッジ日時 | 2024-12-21 11:03:26 |
| 合計ジャッジ時間 | 7,047 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 WA * 1 |
| other | AC * 10 WA * 9 |
ソースコード
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Main main = new Main();
main.solveA();
}
private void solveA() {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[] B = new int[N];
int[] C = new int[N];
for (int i = 0; i < N; i++) {
B[i] = sc.nextInt();
C[i] = sc.nextInt();
}
int M = sc.nextInt();
int[] D = new int[M];
int[] E = new int[M];
for (int i = 0; i < M; i++) {
D[i] = sc.nextInt();
E[i] = sc.nextInt();
}
int ans = 0;
// 0=s 2*N+1=t
Integer[][] costGraph = new Integer[2*N+2][];
for (int i = 0; i < 2*N+2; i++) {
costGraph[i] = new Integer[2*N+2];
}
for (int i = 0; i < N; i++) {
int small = B[i] < C[i] ? B[i] : C[i];
costGraph[0][i+1] = B[i] - small;
costGraph[i+1][N+i+1] = B[i] + C[i] - small;
costGraph[N+i+1][2*N+1] = C[i] - small;
ans += B[i] + C[i] - small;
}
for (int i = 0; i < M; i++) {
costGraph[N+1+D[i]][1+E[i]] = Integer.MAX_VALUE / 3;
}
int current;
int limitDepth = 0;
boolean changed = false;
boolean prevChanged = false;
do {
current = flow(costGraph, 0, Integer.MAX_VALUE / 3, 2 * N + 2, 0, limitDepth, 0);
ans -= current;
if (current == 0) {
if (changed && !prevChanged) {
break;
}
limitDepth++;
prevChanged = false;
} else {
prevChanged = true;
changed = true;
}
} while (limitDepth <= 12);
// 12 > log(1^10) / log(N * 2)
System.out.println(ans);
}
private int flow(Integer[][] graph, int current_id, int current_flow, int max_id, int depth, int limitDepth, int prev) {
if (current_id == max_id - 1) {
return current_flow;
}
if (depth >= limitDepth) {
return 0;
}
int sum_flow = 0;
for (int id = max_id - 1; id >= 0; id--) {
if (graph[current_id][id] != null && graph[current_id][id] > 0 && prev != id) {
int nextFlow = current_flow < graph[current_id][id] ? current_flow : graph[current_id][id];
int tmpFlow = flow(graph, id, nextFlow, max_id, depth+1, limitDepth, current_id);
if (tmpFlow > 0) {
graph[current_id][id] -= tmpFlow;
if (graph[id][current_id] == null) {
graph[id][current_id] = 0;
}
graph[id][current_id] += tmpFlow;
sum_flow += tmpFlow;
current_flow -= tmpFlow;
}
}
}
return sum_flow;
}
}
schwarzahl