[백준11403 / Silver1] 경로 찾기 - Java(자바)

토끼굴·2025년 5월 3일

❓문제 설명


작성자 : 좌상현
문제 링크 : 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]);
            }
        }
    }
}
profile
10마리의 토끼가 열심히 공부 중.. 집단 지성으로 성장해요.

0개의 댓글