반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
05-19 04:57
관리 메뉴

ImJay

[BOJ/Java] 11403. 경로 찾기 본문

알고리즘/BOJ - Java

[BOJ/Java] 11403. 경로 찾기

ImJay 2024. 4. 21. 20:47
반응형

[BOJ/Java] 11403. 경로 찾기

 

11403번: 경로 찾기

가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 길이가 양수인 경로가 있는지 없는지 구하는 프로그램을 작성하시오.

www.acmicpc.net


문제 해석

이 문제는 주어진 방향 그래프에서 각 정점 𝑖에서 𝑗로 가는 경로가 존재하는지를 파악하는 문제다. 입력으로 주어지는 𝑁×𝑁 행렬에서, 행렬의 각 요소가 1인 경우 해당 정점 간에 직접적인 연결이 있음을 나타내며, 0은 연결이 없음을 나타낸다.

풀이 과정

플로이드-와샬 알고리즘을 사용하여 모든 정점 쌍 간의 가능한 경로를 찾는다. 이 알고리즘은 각 정점을 중간 정점으로 고려하며, 간접적인 경로도 고려하여 연결성을 파악한다.

코드

package edu.ssafy.im.BOJ.Silver.S1.No11403;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        new Main().sol();
    }

    private int N;
    private int[][] graph;

    private void sol() throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        N = Integer.parseInt(br.readLine());
        graph = new int[N][N];
        StringTokenizer st;

        // 그래프 초기화
        for (int i = 0; i < N; i++) {
            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;
                    }
                }
            }
        }

        // 결과 출력
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                sb.append(graph[i][j]).append(' ');
            }
            sb.append('\n');
        }
        bw.write(sb.toString());
        bw.flush();
        bw.close();
    }
}

시간 복잡도 분석

플로이드-와샬 알고리즘의 시간 복잡도는 𝑂(𝑁^3)이다. 이는 각 정점을 한 번씩 중간 정점으로 고려하면서 나머지 정점들 사이의 가능한 경로를 업데이트하기 때문이다.

느낀점

플로이드-와샬 알고리즘을 활용해 모든 정점 쌍의 연결성을 파악하는 방법은 그래프 이론을 이해하고 적용하는 데 매우 유용하다. 이 알고리즘은 간단한 코드로 복잡한 문제를 해결할 수 있으며, 다양한 문제에 적용 가능하다는 점에서 매우 효율적이다.

반응형

'알고리즘 > BOJ - Java' 카테고리의 다른 글

[BOJ/Java] 3055. 탈출  (0) 2024.04.22
[BOJ/Java] 2174. 로봇 시뮬레이션  (1) 2024.04.22
[BOJ/Java] 15652. N과 M (4)  (1) 2024.04.21
[BOJ/Java] 1463. 1로 만들기  (0) 2024.04.21
[BOJ/Java] 1753. 최단경로  (0) 2024.04.21
Comments