結果

問題 No.468 役に立つ競技プログラミング実践編
ユーザー yuppe19 😺yuppe19 😺
提出日時 2016-12-18 19:03:10
言語 Java21
(openjdk 21)
結果
TLE  
実行時間 -
コード長 3,216 bytes
コンパイル時間 2,049 ms
コンパイル使用メモリ 78,768 KB
実行使用メモリ 66,872 KB
最終ジャッジ日時 2024-05-08 06:45:18
合計ジャッジ時間 9,531 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 120 ms
46,168 KB
testcase_01 AC 111 ms
40,936 KB
testcase_02 AC 115 ms
40,936 KB
testcase_03 AC 114 ms
40,948 KB
testcase_04 AC 124 ms
41,164 KB
testcase_05 AC 105 ms
40,052 KB
testcase_06 AC 114 ms
41,144 KB
testcase_07 AC 113 ms
40,932 KB
testcase_08 AC 129 ms
40,976 KB
testcase_09 AC 111 ms
40,296 KB
testcase_10 AC 116 ms
41,124 KB
testcase_11 AC 104 ms
39,964 KB
testcase_12 AC 111 ms
40,356 KB
testcase_13 AC 117 ms
41,136 KB
testcase_14 AC 135 ms
41,264 KB
testcase_15 AC 133 ms
41,276 KB
testcase_16 AC 142 ms
41,152 KB
testcase_17 AC 138 ms
41,152 KB
testcase_18 AC 140 ms
41,224 KB
testcase_19 AC 142 ms
41,240 KB
testcase_20 AC 146 ms
41,332 KB
testcase_21 AC 139 ms
41,320 KB
testcase_22 AC 141 ms
41,284 KB
testcase_23 AC 144 ms
41,152 KB
testcase_24 TLE -
testcase_25 -- -
testcase_26 -- -
testcase_27 -- -
testcase_28 -- -
testcase_29 -- -
testcase_30 -- -
testcase_31 -- -
testcase_32 -- -
testcase_33 -- -
testcase_34 -- -
testcase_35 -- -
testcase_36 -- -
権限があれば一括ダウンロードができます

ソースコード

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