티스토리 뷰

알고리즘/백준

[BAEKJOON] 11404 플로이드

응애~ 개발자 2022. 12. 21. 15:11
728x90
반응형

문제 요약

  • 알고리즘 분류: 플로이드 워셜
  • 난이도: Gold4
  • 문제내용:
    • 각 노드간의 최단 거리를 구해라
      • 시작과 도착점은 같은 거리는 없다.
      • 시작점에서 도착점까지 갈수 없으면 0으로 표시한다.
 

11404번: 플로이드

첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가

www.acmicpc.net

문제풀이

   이번에는 문제 유형은 그래프 탐색 관련 문제이다.  모든 노드간의 최단 거리를 구하라는 문제가 나와있고 데이터가 최대 100으로 봤을때 플로이드 워셜 알고리즘으로 해결 할 수가 있다. 시간복잡도는 O(N^3)이지만 구현이 간단하다. 플로이드 워셜 알고리즘에 대한 자세한 설명은 여기에서 확인해보면된다.

 플로이드 워셜 알고리즘을 알면 구현 하는데 문제는 없지만 초기값 세팅을 10만 위로 설정해야 하고 플로이드 워셜 알고리즘 구현후 초기값이랑 같은 값은 0으로 변경하는 처리만 잘하면 통과가 될것이다. 접근, 구현 방법에 대한 설명은 알고리즘만 알고 초기값과 후 처리만 하면 끝이기 때문이다.

 Code

Python

import sys
input = sys.stdin.readline

n = int(input())
INF = 1e7
adj = [[INF] * (n + 1) for _ in range(n + 1)]
for _ in range(int(input())):
    a, b, c= map(int, input().split())
    adj[a][b] = min(adj[a][b], c)

for k in range(1, n + 1):
    for i in range(1, n + 1):
        for j in range(1, n + 1):
            if(i != j):
                adj[i][j] = min(adj[i][j], adj[i][k] + adj[k][j])
            else: adj[i][j] = 0

for i in adj[1:]:
    for j in i[1:]:
        print((j, 0)[j == INF], end= ' ')
    print()

Java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
		
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		int M = Integer.parseInt(br.readLine());
		int[][] adj = new int[N + 1][N + 1];
		int INF = Integer.MAX_VALUE / 2;
		for (int i = 1; i <= N; i++) {
			Arrays.setAll(adj[i], x ->  INF);
		}
		StringTokenizer st;
		int a, b, c;
		for(int i = 0; i < M; i++) {
			st = new StringTokenizer(br.readLine());
			a = Integer.parseInt(st.nextToken());
			b = Integer.parseInt(st.nextToken());
			c = Integer.parseInt(st.nextToken());
			adj[a][b] = Math.min(adj[a][b], c);
		}
		for(int k = 1; k <= N; k++) {
			for (int i = 1; i <= N; i++) {
				for (int j = 1; j <= N; j++) {
					if(i == j) adj[i][j] = 0;
					else adj[i][j] = Math.min(adj[i][j], adj[i][k] + adj[k][j]);
				}
			}
		}
		
		StringBuilder sb = new StringBuilder();
		for (int i = 1; i <= N; i++) {
			for (int j = 1; j <= N; j++) {
				sb.append(adj[i][j] == INF? 0 : adj[i][j]).append(" ");
			}
			sb.append("\n");
		}
		System.out.println(sb);
	}

}
728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함