結果

問題 No.845 最長の切符
ユーザー GrenacheGrenache
提出日時 2019-06-28 22:37:25
言語 Java21
(openjdk 21)
結果
WA  
実行時間 -
コード長 2,129 bytes
コンパイル時間 6,254 ms
コンパイル使用メモリ 76,096 KB
実行使用メモリ 58,704 KB
最終ジャッジ日時 2023-09-14 22:22:26
合計ジャッジ時間 9,836 ms
ジャッジサーバーID
(参考情報)
judge11 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 126 ms
56,048 KB
testcase_01 AC 129 ms
53,924 KB
testcase_02 AC 129 ms
55,872 KB
testcase_03 AC 127 ms
55,692 KB
testcase_04 AC 128 ms
55,848 KB
testcase_05 AC 127 ms
55,780 KB
testcase_06 AC 127 ms
55,624 KB
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 WA -
testcase_20 WA -
testcase_21 WA -
testcase_22 WA -
testcase_23 WA -
testcase_24 WA -
testcase_25 AC 126 ms
55,632 KB
testcase_26 AC 127 ms
55,788 KB
testcase_27 WA -
testcase_28 WA -
testcase_29 AC 126 ms
56,024 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import java.io.*;
import java.util.*;


public class Main_yukicoder845 {

	private static Scanner sc;
	private static Printer pr;

	private static void solve() {
		int n = sc.nextInt();
		int m = sc.nextInt();

		FloydWarshall fw = new FloydWarshall(n);
		for (int i = 0; i < m; i++) {
			int a = sc.nextInt() - 1;
			int b = sc.nextInt() - 1;
			int c = sc.nextInt();
			
			if (fw.d[a][b] == fw.INF || c > fw.d[a][b]) {
				fw.addEdge(a, b, c);
				fw.addEdge(b, a, c);
			}
		}
		
		long max = 0;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				long tmp = fw.getShortestPath(i, j);
				if (i != j && tmp != fw.INF) {
					max = Math.max(max, tmp);
				}
			}
		}
		
		pr.println(max);
	}

	// 全点対最短路 FloydWarshall O(V^3)
	private static class FloydWarshall {
		long[][] d;
		int n;
		long[][] result;
		boolean nf; // NEGATIVE CYCLE flag

		final long INF = Long.MAX_VALUE;

		FloydWarshall(int n) {
			this.n = n;
			d = new long[n][n];
			for (int i = 0; i < n; i++) {
				Arrays.fill(d[i], INF);
				d[i][i] = 0;
			}
			nf = false;
		}

		// i, j:0-indexed
		public void addEdge(int i, int j, int c) {
			d[i][j] = c;
		}

		// 負閉路があるときは-INFを返す
		public long getShortestPath(int i, int j) {
			if (nf) {
				return -INF;
			}

			if (result == null) {
				for (int kk = 0; kk < n; kk++) {
					for (int ii = 0; ii < n; ii++) {
						for (int jj = 0; jj < n; jj++) {
//							d[ii][jj] = Math.min(d[ii][jj], d[ii][kk] + d[kk][jj]);
							if (d[ii][kk] != INF && d[kk][jj] != INF && d[ii][jj] > d[ii][kk] + d[kk][jj]) {
								d[ii][jj] = d[ii][kk] + d[kk][jj];
							}
						}
					}
				}

				for (int k = 0; k < n; k++) {
					if (d[k][k] < 0) {
						nf = true;
						return -INF;
					}
				}

				result = d;
			}

			return result[i][j];
		}
	}

	// ---------------------------------------------------
	public static void main(String[] args) {
		sc = new Scanner(System.in);
		pr = new Printer(System.out);
			
		solve();
			
		pr.close();
		sc.close();
	}

	static class Printer extends PrintWriter {
		Printer(OutputStream out) {
			super(out);
		}
	}
}
0