문제
https://www.acmicpc.net/problem/1238
각 N에 대해 N → X → N 최단 경로를 구하고, 각 최단 경로 중 최댓값을 구하는 문제였다.
문제 풀이
N이 1000까지여서 플로이드 워셜 알고리즘을 이용해 풀었다. 최댓값은 이전 문제를 풀 때 정한 값이다. 이 문제에서는 100 * 10000보다 큰 값이면 돼서 이전에 사용하던 값을 그대로 사용했다.
#define _CRT_SECURE_NO_WARNINGS
#include <vector>
#include<iostream>
using namespace std;
#define MAX_INT 300000000
int map[1001][1001];
int main()
{
int N, M, X;
int a, b, t;
int i, j, k;
int maxDist = 0;
scanf("%d %d %d", &N, &M, &X);
for (i = 1; i <= N; i++) {
for (j = 1; j <= N; j++) {
if (i == j) {
map[i][j] = 0;
continue;
}
map[i][j] = MAX_INT;
}
}
for (i = 0; i < M; i++) {
scanf("%d %d %d", &a, &b, &t);
map[a][b] = t;
}
for (k = 1; k <= N; k++) {
for (i = 1; i <= N; i++) {
for (j = 1; j <= N; j++) {
map[i][j] = min(map[i][k] + map[k][j], map[i][j]);
}
}
}
for (i = 1; i <= N; i++) {
maxDist = max(maxDist, map[i][X] + map[X][i]);
}
printf("%d", maxDist);
return 0;
}
/*
*/