코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

알고리즘/백준

11403번 : 경로 찾기

2023. 8. 30. 12:32

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

 

11403번: 경로 찾기

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

www.acmicpc.net

 

문제

가중치 없는 방향 그래프 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으로 출력해야 한다.

 


소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static int n;
    static int[][] visited;
    static ArrayList<ArrayList<Integer>> list = new ArrayList<>();
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        visited = new int[n][n];
        StringTokenizer st;

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                list.add(new ArrayList<>());
            }
        }

        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            for (int j = 0; j < n; j++) {
                if(Integer.parseInt(st.nextToken()) == 1)
                    list.get(i).add(j);
            }
        }

        for (int i = 0; i < n; i++) {
            dfs(i, i);
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(visited[i][j] + " ");
            }
            System.out.println();
        }
    }

    static void dfs(int x, int y) {
        for (int i = 0; i < list.get(y).size(); i++) {
            int z = list.get(y).get(i);
            if(visited[x][z] == 0) {
                visited[x][z] = 1;
                dfs(x, z);
            }
        }
    }
}

 

해결방법

경로를 찾는 Floyd-Warshall 알고리즘의 기초 문제이다.

원래 플로이드 워셜 알고리즘은 최단 경로의 길이(가중치의 합)를 찾는 것이 목적인데,

이 문제는 단순히 방향 그래프에서 각 노드간에 이동할 수 있는지 없는지를 파악하는 문제였다.

그래프 전체를 완전 탐색해서 노드 간의 이동이 가능한 지만 확인해 주면 해결할 수 있다.

'알고리즘 > 백준' 카테고리의 다른 글

1389번 : 케빈 베이컨의 6단계 법칙  (0) 2023.08.30
2660번 : 회장뽑기  (0) 2023.08.30
10026번 : 적록색약  (0) 2023.08.24
7569번 : 토마토  (0) 2023.08.24
11725번 : 트리의 부모 찾기  (0) 2023.08.24
    '알고리즘/백준' 카테고리의 다른 글
    • 1389번 : 케빈 베이컨의 6단계 법칙
    • 2660번 : 회장뽑기
    • 10026번 : 적록색약
    • 7569번 : 토마토
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바