結果
| 問題 |
No.241 出席番号(1)
|
| ユーザー |
uafr_cs
|
| 提出日時 | 2015-09-11 23:48:17 |
| 言語 | Java (openjdk 23) |
| 結果 |
AC
|
| 実行時間 | 139 ms / 2,000 ms |
| コード長 | 2,499 bytes |
| コンパイル時間 | 2,142 ms |
| コンパイル使用メモリ | 78,776 KB |
| 実行使用メモリ | 41,936 KB |
| 最終ジャッジ日時 | 2024-11-30 21:33:51 |
| 合計ジャッジ時間 | 7,227 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 29 |
ソースコード
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static final int INF = Integer.MAX_VALUE / 2 - 1;
public static int dinic(Vertex s, Vertex t) {
int flow = 0;
for (int p = 1;; p++) {
Queue<Vertex> que = new LinkedList<Vertex>();
s.level = 0;
s.p = p;
que.offer(s);
while (!que.isEmpty()) {
Vertex v = que.poll();
v.iter = v.es.size() - 1;
for (Edge e : v.es)
if (e.to.p < p && e.cap > 0) {
e.to.level = v.level + 1;
e.to.p = p;
que.offer(e.to);
}
}
if (t.p < p){
return flow;
}
for (int f; (f = dfs(s, t, INF)) > 0;){
flow += f;
}
}
}
public static int dfs(Vertex v, Vertex t, int f) {
if (v == t) {
return f;
}
for (; v.iter >= 0; v.iter--) {
Edge e = v.es.get(v.iter);
if (v.level < e.to.level && e.cap > 0) {
int d = dfs(e.to, t, Math.min(f, e.cap));
if (d > 0) {
e.cap -= d;
e.rev.cap += d;
return d;
}
}
}
return 0;
}
public static class Vertex {
ArrayList<Edge> es = new ArrayList<Edge>();
int level, p, iter;
int id;
public Vertex(int id){ this.id = id; }
void add(Vertex to, int cap) {
Edge e = new Edge(to, cap), rev = new Edge(this, 0);
e.rev = rev;
rev.rev = e;
es.add(e);
to.es.add(rev);
}
}
public static class Edge {
Vertex to;
Edge rev;
int cap;
Edge(Vertex to, int cap) {
this.to = to;
this.cap = cap;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
final int N = sc.nextInt();
int[] number = new int[N];
for(int i = 0; i < N; i++){
number[i] = sc.nextInt();
}
Vertex s = new Vertex(-1);
Vertex t = new Vertex(-1);
Vertex[] from = new Vertex[N];
Vertex[] to = new Vertex[N];
for(int i = 0; i < N; i++){
from[i] = new Vertex(i);
to[i] = new Vertex(i);
}
for(int i = 0; i < N; i++){
s.add(from[i], 1);
to[i].add(t, 1);
}
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
if(number[i] != j){
from[i].add(to[j], 1);
}
}
}
final int flow = dinic(s, t);
if(flow < N){
System.out.println(-1);
}else{
LOOP:
for(int i = 0; i < N; i++){
for(Edge e : from[i].es){
if(e.cap == 0){
System.out.println(e.to.id);
continue LOOP;
}
}
}
}
}
}
uafr_cs