코딩테스트

[python 백준] 11403번 : 경로 찾기 (실버 1)

Alpaca_data_cloud 2024. 8. 12. 17:28

 

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으로 출력해야 한다.

예제 입력 1 복사

3
0 1 0
0 0 1
1 0 0

예제 출력 1 복사

1 1 1
1 1 1
1 1 1

예제 입력 2 복사

7
0 0 0 1 0 0 0
0 0 0 0 0 0 1
0 0 0 0 0 0 0
0 0 0 0 1 1 0
1 0 0 0 0 0 0
0 0 0 0 0 0 1
0 0 1 0 0 0 0

예제 출력 2 복사

1 0 1 1 1 1 1
0 0 1 0 0 0 1
0 0 0 0 0 0 0
1 0 1 1 1 1 1
1 0 1 1 1 1 1
0 0 1 0 0 0 1
0 0 1 0 0 0 0

 

해당 문제는 경로가 이어진다면 그 경로를 1로 다 표시해주면 된다.

해당 문제를 풀때에는 결과의 행을 고정하고 지나가는 경로를 다 1로 표시해주면 된다. 시간 복잡도는 고려하지 않고 풀었지만 성공했다.

def dfs(row,start,result):
    global stack
    for i in range(len(stack)):
        if stack[start][i] == 1 and result[row][i] == 0:
            result[row][i] = 1
            dfs(row,i,result)
    return


n = int(input())
stack = list()
result = [[0 for _ in range(n)] for _ in range(n)]

for _ in range(n):
    stack.append(list(map(int,input().split())))

for i in range(n):
    dfs(i,i,result)

for j in range(n):
    print(' '.join(map(str,result[j])))