Skip to content

Conversation

@oncsr
Copy link
Contributor

@oncsr oncsr commented Jul 19, 2025

🧷 문제 링크

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

🧭 풀이 시간

25분

👀 체감 난이도

✏️ 문제 설명

정점 N개, 간선 M개인 그래프가 있고, 각 정점에는 가중치가 존재한다.
이 그래프에 질문이 Q개 들어오면 전부 답해주자.

각 질문은 정수 S, E로 이루어져 있다.

  1. 두 사람이 각각 S번 정점, E번 정점에 있는 상태로 시작한다.
  2. 두 사람이 전화로 연락하여 누가 움직일지 결정한다. 이 때 전화에 드는 비용은 두 사람이 서있는 정점의 가중치의 곱이다.
  3. 둘 중 한 사람이 간선을 하나 타고 이동한다.
  4. 전화로 생사를 확인한다. 마찬가지로 정점의 가중치의 곱만큼 비용이 든다.
  5. 두 사람이 각각 E번 정점, S번 정점에 있는 상태가 되면 종료된다.

질문의 답은 전화에 든 비용 중 최댓값이 된다.
이 값을 최소화해서 알려주자.

🔍 풀이 방법

  • 최소 스패닝 트리
  • 희소 배열

이 문제는 N이 작아서, 두 사람이 밟고 있는 정점 상태의 가짓수가 N^2인데 이렇게 해도 250,000밖에 안 된다.

따라서 그래프를 N^2개의 정점이 있도록 리모델링한다. 이 때 간선의 개수는 약 4NM개 정도가 나오는데 M <= 3,000이라 2NM <= 3,000,000 이라 충분히 괜찮다.
이 때 새로 만든 그래프의 정점 가중치는 당연히 원래 그래프에서의 두 정점의 가중치 곱이 된다.

그럼 각 질문을 재해석할 수 있다.
새로 만든 그래프에서 (S, E) -> (E, S)로 가는 경로에 속한 정점의 가중치 중 최댓값이 질문의 답이 된다.
물론 이런 경로가 여러 개 존재할 수 있으므로, 최소 스패닝 트리를 구해서 최적 경로로만 이동하도록 할 수 있다.

그럼 이제 새로 만든 최소 스패닝 트리에서 질문의 답을 구하면 된다.
각 질문의 답을 로그 시간에 구해야 한다.

최소 스패닝 트리에서 아무 점이나 루트로 잡고, 희소 배열을 구축한다.
parent[n][k] = n번 정점에서 부모를 타고 2^k번 이동했을 때의 정점 번호
value[n][k] = n번 정점에서 부모를 타고 2^k번 이동했을 때의 정점 가중치 최댓값
-> parent[n][k] = parent[parent[n][k-1]][k-1]
-> value[n][k] = max(value[n][k-1], value[parent[n][k-1]][k-1])

이제 질문 (S, E)가 들어오면,
저 트리에서 정점 (S, E)와 (E, S)를 희소 배열로 위로 올리면서 value의 최댓값을 찾아 답해주면 된다.

⏳ 회고

@oncsr oncsr added the success 👍 해설을 보지 않고 풀었을 때 label Jul 19, 2025
@ShinHeeEul ShinHeeEul merged commit b9e0d0d into main Jul 19, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

success 👍 해설을 보지 않고 풀었을 때

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants