Jun's Development Journey
[Algorithm] Flowd-Warshall 기법 설명 및 활용 본문
1. Flowd-Warshall
- 변의 가중치가 음이거나 양인 가중 그래프에서 최단 경로를 찾는 알고리즘
- 경유지를 거쳐 갈 수 있는 경우를 체크하여 기록하고 활용하는 기법
2. 예시 문제
문제)
11403번: 경로 찾기
가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 경로가 있는지 없는지 구하는 프로그램을 작성하시오.
www.acmicpc.net
풀이)
import java.io.*;
import java.util.*;
public class Main {
static int N;
static int[][] map;
public static void floyd_warshall() {
for(int k=1;k<=N;k++) {//K : 경유지
for(int i=1;i<=N;i++) {//i : 시작점
for(int j=1;j<=N;j++) {//j : 끝점
if(map[i][k]==1 && map[k][j]==1)
map[i][j] = 1;
}
}
}
}
public static void print_map() {
for(int i=1;i<=N;i++) {
for(int j=1;j<=N;j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
}
public static void main(String[] args) throws IOException {
//선언 및 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
map = new int[N+1][N+1];
//맵 정보 입력
for(int i=1;i<=N;i++) {
st = new StringTokenizer(br.readLine());
for(int j=1;j<=N;j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
//플로이드 와샬
floyd_warshall();
//출력
print_map();
}
}