작성자 : 좌상현
문제 링크 : https://www.acmicpc.net/problem/11403
가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 길이가 양수인 경로가 있는지 없는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정점의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄부터 N개 줄에는 그래프의 인접 행렬이 주어진다. i번째 줄의 j번째 숫자가 1인 경우에는 i에서 j로 가는 간선이 존재한다는 뜻이고, 0인 경우는 없다는 뜻이다. i번째 줄의 i번째 숫자는 항상 0이다.출력
총 N개의 줄에 걸쳐서 문제의 정답을 인접행렬 형식으로 출력한다. 정점 i에서 j로 가는 길이가 양수인 경로가 있으면 i번째 줄의 j번째 숫자를 1로, 없으면 0으로 출력해야 한다.

모든 정점 (i,j) 쌍에 대하여, i에서 j로 가는 경로가 존재하는지 확인하는 문제입니다.
이때, 모든 정점간의 연결 관계를 구할 수 있는 플로이드 워셜 알고리즘을 이용하여 풀 수 있습니다.중간 노드 (k) 를 통하는 길이 존재하는 경우, 해당 정점 쌍 사이에 경로가 가능하다는 의미이므로,
(= graph[i][k] == 1 && graph[k][j] == 1)
기존 그래프 내에서 반영해 줍니다.예를 들어, 0 -> 1 -> 2 인 경로가 존재한다면,
graph[0][2] == 1로 만들어 주면 됩니다.
모든 중간 노드를 거쳐가는 경우를 반영했다면, 0 -> 1 -> 2 -> 3 같은 경로 또한 반영이 될 것입니다.
마지막으로 출력 형태에 맞게 출력해주면 됩니다!
import java.util.*;
import java.io.*;
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[][] graph = new int[N][N];
for(int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j = 0; j < N; j++) {
graph[i][j] = Integer.parseInt(st.nextToken());
}
}
for(int k = 0; k < N; k++) {
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
if(graph[i][k] == 1 && graph[k][j] == 1) {
graph[i][j] = 1;
}
}
}
}
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
System.out.println(graph[i][j]);
}
}
}
}