結果

問題 No.468 役に立つ競技プログラミング実践編
ユーザー yuppe19 😺
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #

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();
  }
}
0