

플로이드 워셜 또는 다익스트라로 풀이한다. 다익스트라도 다시 연습하겠다.
처음에 routeData를 초기화할때 직접적인 길이 없다는 의미로 1001로 초기화를 했다. 이때 만약 비용이 1000, 1000이라서 합이 1001 이상이라 경유하는 길이 있어도 갱신이 안되는 문제가 있었다. 좀 더 큰 값으로 바꿔 해결했다.
import java.util.Arrays;
import java.util.Scanner;
import static java.lang.Math.min;
public class bj1719 {
static Scanner scanner = new Scanner(System.in);
static int[][] routeData;
static int[][] map;
static int INF = 200 * 100001;
public static void main(String[] args) {
inputData();
findAnswer();
scanner.close();
}
public static void inputData(){
System.out.println("inputData()");
int n, m;
int i, j, a, b, time;
n = scanner.nextInt();
m = scanner.nextInt();
routeData = new int[n+1][n+1];
map = new int[n+1][n+1];
for(i = 1; i < routeData.length; i++)// 전체 초기화
{
Arrays.fill(routeData[i], INF);//전체 초기화 하는 법
}
for(i = 1; i < routeData.length; i++)//자기 자신으로 가는 경로 초기화
{
routeData[i][i] = 0;
}
for(i = 1; i < map.length; i++)//i번에서 j번으로 처음 접근하는 방법은 j이다.
{
for(j = 1; j < map[i].length; j++)
{
map[i][j] = j;
}
}
for(i = 1; i < map.length; i++)//자기 자신으로 가는 경로 초기화
{
map[i][i] = 0;
}
for(i = 0; i < m; i++)//입력
{
a = scanner.nextInt();
b = scanner.nextInt();
time = scanner.nextInt();
routeData[a][b] = time;
routeData[b][a] = time;//양방향 저장
}
System.out.println("입력 결과");
System.out.println("routeData");
for(i = 1; i < routeData.length; i++) {
for (j = 1; j < routeData[i].length; j++) {
System.out.print(routeData[i][j] + " ");
}
System.out.println();
}
System.out.println("map");
for(i = 1; i < map.length; i++) {
for (j = 1; j < map[i].length; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
public static void findAnswer(){
System.out.println("findAnswer()");
int i, j, k, temp;
System.out.println("플로이드 워셜 수행");
for(k = 1; k < routeData.length; k++)
{
for(i = 1; i < routeData.length; i++)
{
for(j = 1; j < routeData.length; j++)
{
temp = routeData[i][k] + routeData[k][j];
if(routeData[i][j] > temp)
{
routeData[i][j] = temp;
map[i][j] = map[i][k];
}
}
}
}
System.out.println("플로이드 워셜 수행 결과 routeData");
for(i = 1; i < routeData.length; i++) {
for (j = 1; j < routeData[i].length; j++) {
System.out.print(routeData[i][j] + " ");
}
System.out.println();
}
System.out.println();
System.out.println("플로이드 워셜 수행 결과 map");
for(i = 1; i < map.length; i++) {
for (j = 1; j < map[i].length; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
System.out.println();
for(i = 1; i < map.length; i++) {
for (j = 1; j < map[i].length; j++) {
if(i == j)
{
System.out.print("- ");
}
else
{
System.out.print(map[i][j] + " ");
}
}
System.out.println();
}
}
}