알고리즘/그래프 탐색

[BOJ 11403] 경로 찾기 (Java, 그래프 탐색)

leejinwoo1126 2023. 6. 9. 22:23
반응형

 

 


문제 링크

https://www.acmicpc.net/problem/11403

 

11403번: 경로 찾기

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

www.acmicpc.net


풀이 

- 단방향 그래프 문제 

 

예제 입력의 경우 아래와 같이 해석됨

예제 입력 1
3
0 1 0
0 0 1
1 0 0

예제 출력1
1 1 1
1 1 1
1 1 1

#정점(N)이 3개이고 간선이 존재한다는 뜻
1 -> 2
2 -> 3
3 -> 1

 

그래서 i = 1일때 1번 노드에서 방문 가능한 노드를 찾고 row 로 출력하면 되는 문제

i = 2일때 2번 노드에서 방문가능한 노드 찾아 row 출력 

i = 3일때 3번 노드에서 방문가능한 노드 찾아 row 출력

 

이때 해당 노드(i)의 경우 0으로 초기화하고 다른 노드 통해 방문 가능 여부 파악해야 함


제출 코드

import java.util.*;
import java.io.*;

public class Main {
    
    static StringBuilder sb = new StringBuilder();

    static int N;

    static List<Integer>[] adj;

    static int[] visit;
    static void input() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());

        adj = new ArrayList[N + 1];
        for(int i = 0; i <= N; i++) adj[i] = new ArrayList<>();

        for(int i = 1; i <= N; i++) {
            st = new StringTokenizer(br.readLine());
            for(int j = 1; j <= N; j++) {
                int value = Integer.parseInt(st.nextToken());
                if(value == 1) {
                    adj[i].add(j);
                }
            }
        }
    }

    static void initVisit() {
        if(visit == null) {
            visit = new int[N + 1];
        } else {
            for(int i = 1; i <= N; i++) {
                visit[i] = 0;
            }
        }
    }

    static void bfs(int start) {
        Queue<Integer> que = new LinkedList<>();
        que.add(start);

        initVisit();

        while(!que.isEmpty()) {
            int x = que.poll();

            for(int y : adj[x]) {
                if(visit[y] == 0) {
                    visit[y] = 1;
                    que.add(y);
                }
            }
        }

        for(int i = 1; i <= N; i++) sb.append(visit[i]).append(' ');

    }

    static void pro() {
        for(int i = 1; i <= N; i++) {
            bfs(i);
            sb.append("\n");
        }

        System.out.println(sb);
    }

    public static void main(String[] args) throws Exception {
        input();
        pro();
    }

}
반응형