結果
| 問題 | No.468 役に立つ競技プログラミング実践編 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2016-12-18 19:03:10 |
| 言語 | Java (openjdk 23) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,216 bytes |
| 記録 | |
| コンパイル時間 | 2,586 ms |
| コンパイル使用メモリ | 78,892 KB |
| 実行使用メモリ | 126,500 KB |
| 最終ジャッジ日時 | 2024-12-14 08:34:24 |
| 合計ジャッジ時間 | 41,509 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 21 TLE * 10 |
| other | AC * 5 TLE * 1 |
ソースコード
import java.io.*;
import java.util.*;
import java.util.stream.*;
import static java.lang.Math.*;
class FastScanner { // {{{
private final InputStream in = System.in;
private final byte[] buffer = new byte[1024];
private int ptr = 0;
private int buflen = 0;
private boolean hasNextByte() {
if(ptr < buflen) { return true; }
ptr = 0;
try {
buflen = in.read(buffer);
} catch(IOException ex) {
ex.printStackTrace();
}
if(buflen <= 0) { return false; }
return true;
}
private int readByte() { if(hasNextByte()) { return buffer[ptr++]; } return -1; }
private static boolean isPrintableChar(int c) { return 33 <= c && c <= 126; }
private void skipUnprintable() { while(hasNextByte() && !isPrintableChar(buffer[ptr])) { ptr++; } }
public boolean hasNext() { skipUnprintable(); return hasNextByte(); }
public String next() {
if(!hasNext()) { throw new NoSuchElementException(); }
StringBuilder sb = new StringBuilder();
int b = readByte();
while(isPrintableChar(b)) {
sb.appendCodePoint(b);
b = readByte();
}
return sb.toString();
}
public long nextLong() {
if(!hasNext()) { throw new NoSuchElementException(); }
long n = 0;
boolean minus = false;
int b = readByte();
if(b == '-') {
minus = true;
b = readByte();
}
if(b < '0' || '9' < b) { throw new NumberFormatException(); }
while(true) {
if('0' <= b && b <= '9') {
n *= 10;
n += b - '0';
} else if(b == -1 || !isPrintableChar(b)) {
return minus ? -n : n;
} else {
throw new NumberFormatException();
}
b = readByte();
}
}
} // }}}
class Edge {
int from, to, cost;
public Edge(int from, int to, int cost) {
this.from = from;
this.to = to;
this.cost = cost;
}
}
public class Main {
private void solve() {
FastScanner sc = new FastScanner();
int n = (int)sc.nextLong(),
m = (int)sc.nextLong();
Edge[] G0 = new Edge[m],
rG = new Edge[m];
for(int i=0; i<m; ++i) {
int a = (int)sc.nextLong(),
b = (int)sc.nextLong(),
c = (int)sc.nextLong();
G0[i] = new Edge(a, b, -c);
rG[i] = new Edge(b, a, -c);
}
int[] cost0 = new int[n];
Arrays.fill(cost0, 1);
cost0[0] = 0;
while(true) {
boolean update = false;
for(Edge e : G0) {
if(cost0[e.from] != 1 && cost0[e.to] > cost0[e.from] + e.cost) {
cost0[e.to] = cost0[e.from] + e.cost;
update = true;
}
}
if(!update) { break; }
}
int days = -cost0[n-1];
int[] rcost = new int[n];
Arrays.fill(rcost, 1);
rcost[n-1] = 0;
while(true) {
boolean update = false;
for(Edge e : rG) {
if(rcost[e.from] != 1 && rcost[e.to] > rcost[e.from] + e.cost) {
rcost[e.to] = rcost[e.from] + e.cost;
update = true;
}
}
if(!update) { break; }
}
int cnt = 0;
for(int i=0; i<n; ++i) {
if(-cost0[i] != days + rcost[i]) { ++cnt; }
}
System.out.printf("%d %d/%d\n", days, cnt, n);
}
public static void main(String[] args) {
new Main().solve();
}
}