https://www.acmicpc.net/problem/1471
티어: 플래티넘 4
로직
흔한 다른 SCC 문제와는 다르게, 문제에서 딱히 그래프라고 주어진게 없습니다.
그래프 먼저 만들어야 문제가 쉬워집니다.
먼저, n + 1 크기의 1차원 정수 배열 graph를 만들고, 0으로 초기화합니다.
graph[a]는 a번 칸에 있을 때, 다음으로 방문할 칸의 번호를 나타냅니다.
1부터 n+1까지 for문을 돌리며 graph 값을 지정해줍니다.
만들어진 그래프를 SCC 단위로 분리해줍니다.
다음으로, n + 1 크기의 1차원 정수 배열 dp를 만들고, -1로 초기화합니다.
dp[a]는 a번 칸에서 방문할 수 있는 칸의 최대 개수를 의미합니다.
크기가 2 이상의 SCC 안에 포함되는 칸은 dp값을 그 SCC의 크기로 지정해줍니다.
1부터 n+1까지 for문을 돌리며, dp값이 -1이 아니라면 dfs를 돌립니다.
dfs는 우선, 다음 방문할 노드를 정하고 다음과 같은 동작을 합니다.
1. 시작 노드와 다음 노드가 같다면(무한루프) dp[시작 노드]값을 1로 지정해줍니다.
2. dp[다음 노드]값이 -1이 아니라면, 이미 계산이 된 것이므로 dp[시작 노드]값을 dp[다음 노드] + 1로 지정합니다.
3. 둘 다 아니라면, 다음 노드의 값도 계산이 필요하므로 dp[시작 노드]값을 dfs(다음 노드) + 1로 지정합니다.
4. dp[시작 노드]값을 리턴합니다.
dp의 값들 중 가장 큰 값이 정답이 됩니다.
재밌다
'백준 & 알고리즘' 카테고리의 다른 글
[파이썬] 백준 1108번 - 검색 엔진 (0) | 2023.10.17 |
---|---|
[파이썬] 백준 26157번 - 즉흥 여행 (Hard) (0) | 2023.10.16 |
[파이썬] 백준 3682번 - 동치 증명 (0) | 2023.10.15 |
[파이썬] 백준 4013번 - ATM (0) | 2023.10.13 |
Top-down DP와 Bottom-up DP의 차이점과 장단점, 쓰는 경우 (1) | 2023.06.23 |