플로이드

Updated:

모든 노드 정점간의 최단거리를 구하기 위한 알고리즘 각 노드에서 바로 갈수 있는 정점을 먼저 배열에 표시

노드에서 거쳐가는 노드를 확인한다

  • 배열 가장 왼쪽부터 위에서 아래로 확인을 지금 확인한 노드가 특정정점으로 간다면
    특정 정점으로 가는것을 확인하고 그 특정 정점을 거쳐서 갈수 있는 최단거리를
    지금 노드를 기준으로 비교하고 업데이트

배열을 사용하기 때문에 공간복잡도 문제 음수에서도 사용 할 수 있다

package Jun_2020_05_11;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
	static int[][] di;
	static int[][] p;
	static int n;
	static ArrayList<Node>[] list;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		n = sc.nextInt();
		int m = sc.nextInt();

		di = new int[n + 1][n + 1];
		p = new int[n + 1][n + 1];
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				di[i][j] = 10000000;
			}
			di[i][i] = 0;
		}

		for (int i = 0; i < m; i++) {
			int s = sc.nextInt();
			int f = sc.nextInt();
			int cost = sc.nextInt();
			if (di[s][f] > cost)
				di[s][f] = cost;
		}

		floyd();
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				if (di[i][j] == 10000000)
					di[i][j] = 0;
				System.out.print(di[i][j] + " ");
			}
			System.out.println();
		}

	}
/////////////////////////////////////////////////// 알고리즘 구현 부분
	static void floyd() {
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				if (di[j][i] != 0 && di[j][i] != 10000000) {
					for (int k = 1; k <= n; k++) {
						if (di[i][k] + di[j][i] < di[j][k])
							di[j][k] = di[i][k] + di[j][i];
					}
				}
			}
		}
	}
////////////////////////////////////////////////////
	static class Node {
		int f, cost;

		Node(int f, int cost) {
			this.f = f;
			this.cost = cost;
		}
	}
}

Leave a comment