반응형
문제링크
https://www.acmicpc.net/problem/31723
문제 총평
- 평범한 다익스트라에 아이디어 조금 첨가
문제 접근방식
- 이 문제에 경우 사실 간단합니다.
- 먼저 평범한 다익스트라 처럼 간선을 받아주고 무빙워크의 반대 방향으로는 *2의 길이로 받아줍니다.
- 이때 이 간선들은 버리지 말고 나중 출력을 위해 따로 모아 놓습니다.
- 그리고 다익스트라를 돌리면 1에서부터의 모든 정점의 거리가 나옵니다.
- 이때 따로 모아 놓았던 간선을 확인 합니다.
경우의 수
1. dist[u] >= d[v] 인 경우
2. dist[u] < d[v] 인 경우
- 이 두 경우에서 2번을 주목하면 되는데 dist[u] < d[v]라는거는 정점 1에서 u 정점으로 간 이후 u 정점에서 임의의 경로를 통해 d[v] 로 이동했다는 뜻입니다. 즉, 이경우 방향이 u -> v 이므로 무빙워크를 키는게 반드시 이득입니다.
- 1번의 경우에는 v -> u 로 이동하였기 때문에 무빙워크의 반대 방향이므로 이 경우 무빙워크를 끄는게 이득입니다.
- 물론 끄거나 키거나 같은 결과가 나올 수도 있으나 이 문제는 스페셜저지 문제이므로 신경쓰지 않습니다.

정답코드
import sys; input = sys.stdin.readline
import heapq as h
n, m = map(int, input().split())
arr = [[] for _ in range(n+1)]
moving = []
for _ in range(m):
a,b,c = map(int, input().split())
moving.append((a,b))
arr[a].append((b,c))
arr[b].append((a,c<<1))
d = [0,0] + [int(1e12)]*(n-1)
q = []
h.heappush(q, (0, 1))
while q:
dist, now = h.heappop(q)
if d[now] < dist: continue
for x,y in arr[now]:
cost = y + d[now]
if cost < d[x]:
d[x] = cost
h.heappush(q,(cost,x))
print(sum(d[1:]))
for x,y in moving:
if d[x] < d[y]:
print("1",end=" ")
else:
print("0", end=" ")
문제 풀이 후 생각
- 어찌보면 정말 간단하지만 대회 당시에 이런걸 생각하기에는 난이도가 상당해 보입니다.
반응형
'알고리즘' 카테고리의 다른 글
| 백준 31537번: 출근하기 싫어 1 (Python) (0) | 2024.04.10 |
|---|---|
| 백준 31741번: 구간 덮기 (Python, Rust) (0) | 2024.04.09 |
| 백준 31721번: 수강신청 (Python) (0) | 2024.04.07 |
| 백준 4342번: 유클리드 게임 (Python) (1) | 2024.02.11 |
| 백준 25319번: Twitch Plays VIIIbit Explorer (0) | 2024.01.22 |