[BOJ] 1702. 고속도로

starbow·2024년 6월 6일

PS/CP

목록 보기
9/25

문제 링크

가중치가 있는 무방향 그래프가 주어집니다. 각 간선에는 요금과 시간에 해당하는 가중치가 있습니다. 저희의 목표는 주어진 그래프의 모든 최적의 경로들의 서로 다른 비용-시간 쌍의 갯수를 구하는것입니다. 어떤 경로의 비용-시간 쌍이 (c,t)(c, t)일 때, 임의의 경로의 비용-시간 쌍 (c,t)(c', t')에 대하여 ccc \leq c'ttt \leq t'을 만족한다면 해당 경로를 최적의 경로라고 부릅니다.

집합 S={(c,t)S = \{(c, t) \, | 비용이 c,c, 시간이 tt인 최적의 경로가 존재}\}라고 정의 하겠습니다. 우리가 출력해야 하는 값은 S|S|가 됩니다.

이 때, 집합 SS의 모든 원소들은 c1<c2c_{1} < c_{2}이면, t1>t2t_{1} > t_{2}를 만족해야 합니다. 다시말해 ss에서 ee로가는 경로들 중에서 각 비용에 대한 최단 경로들의 길이를 구할 수 있다면 그 최단 경로의 길이를 비용이 작은것 부터 큰 순서대로 확인하면서 S|S|를 구할 수 있습니다.

그럼 각 비용에 대한 최단 경로들의 길이를 어떻게 구할 수 있을까요? 먼저 주어진 그래프를 토대로 아래와 같이 새로운 그래프를 만듭니다.

  • 원래 그래프에서 정점 aabb를 연결하는 간선 ee가 존재하고 비용이 cec_{e}, 시간이 tet_{e}라면 새로운 그래프에는 정점 (a,c)(a, c)에서 (b,c+ce)(b, c+c_{e})로 향하는 간선과 정점 (b,c)(b, c)에서 (a,c+ce)(a, c+c_{e})로 향하는 간선을 추가합니다. 각 간선은 방향이 있으며 가중치는 tt입니다.

새롭게 만든 그래프에서 (s,0)(s, 0)에서 (e,x)(e, x)로 가는 최단 경로의 길이는 원래 그래프에서 ss에서 ee로 가는 경로들 중에서 비용이 정확히 xx가 드는 경로들 중 최단 경로의 길이가 됩니다. 즉, 새롭게 만든 그래프에서 다익스트라 알고리즘을 사용하여 각 비용에 대한 최단 경로들의 길이를 구할 수 있습니다.

비용은 최대 O(nmax(c))O(n \cdot max(c))까지만 고려하면 되므로 시간복잡도는 O(nmmax(c)(logn+logm+logmax(c)))O(n \cdot m \cdot max(c) (\log{n}+\log{m}+\log{max(c)}))가 됩니다.

profile
🎈 Journey of problem solving

0개의 댓글