Hanbit the Developer
[Python] 백준 14289번: 본대 산책3 본문
https://www.acmicpc.net/problem/14289
import sys
input = sys.stdin.readline
MOD = 1000000007
def multiply_matrix(matrix1, matrix2):
return [[sum(matrix1[i][k]*matrix2[k][j] % MOD for k in range(n)) % MOD
for j in range(n)] for i in range(n)]
def solution(D):
# DP 초기화
dp1 = [[0]*n for _ in range(n)]
for k, v in graph.items():
for adj in v:
dp1[k][adj] = 1
dp2 = [[0]*n for _ in range(n)]
for i in range(n):
dp2[i][i] = 1
# 행렬 제곱
while D > 0:
if D % 2 == 1:
dp2 = multiply_matrix(dp1, dp2)
D -= 1
dp1 = multiply_matrix(dp1, dp1)
D //= 2
return dp2[0][0]
if __name__ == '__main__':
n, m = map(int, input().split())
graph = {i: [] for i in range(n)}
for _ in range(m):
a, b = map(int, input().split())
a -= 1
b -= 1
graph[a].append(b)
graph[b].append(a)
D = int(input())
print(solution(D))
인접행렬의 곱을 통한 경우의 수 구하기를 조금 응용한 문제이다. 아래 링크를 참고하자.
12850번에서 초기값이 고정되어있지 않다는 점이 다른 점이다. 이에 대해서, dp1(1번 이동했을 때의 경우의 수)를 초기화시켜주는 점 말고는 변함이 없다.
'Algorithm > 백준' 카테고리의 다른 글
[Python] 백준 9184번: 신나는 함수 실행 (0) | 2021.09.27 |
---|---|
[Python] 백준 6549번: 히스토그램에서 가장 큰 직사각형 (0) | 2021.09.27 |
[Python] 인접행렬의 제곱(백준 12850번: 본대 산책 2) (0) | 2021.09.24 |
[Python] 백준 9527번: 1의 개수 세기 (0) | 2021.09.17 |
[Java] 백준 2565번: 전깃줄 (0) | 2021.09.15 |