11403 경로찾기

hey hey·2022년 1월 16일
0

알고리즘

목록 보기
29/57
post-thumbnail

문제

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

풀이

a-> b로 가는 길이 있다면 1로 표시되는 입력값을 가진다.
이 값들을 리스트에 새로운 방식으로 만들어 주게 된다 .
a번째 인덱스 리스트 = [b,@]
한 줄씩 visited를 만들어서 이 줄을 root라고 선언하고
root에서 갈수 있는 모든 점들을 visited로 만들어준다.

import sys
sys.stdin =open('input.txt')

N = int(input())

graph = [[]for _ in range(N)]       # 그래프 형태 바꾸기
for i in range(N):
    ls =list(map(int,input().split()))
    for j in range(N):
        if ls[j]==1:
            graph[i].append(j)


visit = [[0]*N for _ in range(N)]   # a->b로 가는 길의 유무
def dfs(start):                     # 시작값 start
    global root                     # root는 한 줄 씩 만들어 진다고 보면 됨
                                    # root번째 줄의 visit를 만드는 과정
    for i in graph[start]:          # start에서 나오는 길 중에
        if visit[root][i]==0:       # root-> i 가 아직 안갔으면
            visit[root][i]=1        # 방문처리하고 , i->다른거로 가는 길 찾기
            dfs(i)



for root in range(N):       # N까지 한 줄 씩 visit를 만드는 과정
    dfs(root)

for v in visit:
    print(*v)
profile
FE - devp

0개의 댓글