티스토리 뷰

Python (TEST)

BOJ - 9370. 미확인 도착지

Silverism 2020. 8. 7. 14:35

www.acmicpc.net/problem/9370

 

9370번: 미확인 도착지

문제 (취익)B100 요원, 요란한 옷차림을 한 서커스 예술가 한 쌍이 한 도시의 거리들을 이동하고 있다. 너의 임무는 그들이 어디로 가고 있는지 알아내는 것이다. 우리가 알아낸 것은 그들이 s지��

www.acmicpc.net

 

1. S. G. H을 시작점으로 하여 3번에 걸쳐 다익스트라:

import sys
from heapq import heappush, heappop
for _ in range(int(input())):
    n, m, t = map(int, input().split())
    s, g, h = map(int, input().split())
    road = [[] for _ in range(n + 1)]
    for _ in range(m):
        a, b, c = map(int, sys.stdin.readline().split())
        road[a].append((b, c))
        road[b].append((a, c))
    ds = {}
    for i in (s, g, h):
        d = [1000 * n] * (n + 1)
        d[i] = 0
        q = [(0, i)]
        while q:
            _, a = heappop(q)
            for b, c in road[a]:
                if d[b] > d[a] + c:
                    d[b] = d[a] + c
                    heappush(q, (d[b], b))
        ds[i] = d
    ans = []
    for _ in range(t):
        i = int(input())
        if ds[g][h] + min(ds[s][g] + ds[h][i], ds[s][h] + ds[g][i]) == ds[s][i]:
            ans.append(i)
    ans.sort()
    print(*ans)

 

2. G, H를 지나는 도로에 한해 가중치 조작:

import sys
from heapq import heappush, heappop
for _ in range(int(input())):
    n, m, t = map(int, input().split())
    s, g, h = map(int, input().split())
    road = [[] for _ in range(n + 1)]
    for _ in range(m):
        a, b, c = map(int, sys.stdin.readline().split())
        if a == g or a == h:
            c -= .18
        if b == g or b == h:
            c -= .18
        if (a, b) == (g, h) or (a, b) == (h, g):
            c -= .18
        road[a].append((b, c))
        road[b].append((a, c))
    d = [1000 * n] * (n + 1)
    v = [0] * (n + 1)
    q = [(0, s)]
    while q:
        p, a = heappop(q)
        if not v[a]:
            v[a] = 1
            d[a] = p
            for b, c in road[a]:
                heappush(q, (p + c, b))
    ans = []
    for _ in range(t):
        i = int(input())
        p = d[i]
        if type(p) is float and int(p) == round(p):
            ans.append(i)
    ans.sort()
    print(*ans)

2번 코딩에서,

최단 경로가 아래 경우이면 가능:
g > h
@ > g, g > h, h > @
@ > g, g > h
@ > g, g > @, @ > h
@ > g, g > @, @ > h, h > @
...
그 외의 경우에서는 불가능.

불가능한 경우에서 조작된 가중치를 가장 많이 거치는 건 2번.
g > h의 경우에서는 가능하게 만들어야 하기 때문에,
g > h의 가중치는 @ > g, @ > h의 가중치의 2배보다 크도록 설정.

'Python (TEST)' 카테고리의 다른 글

SWEA - 1249. 보급로  (0) 2020.08.05
SWEA - 1767. 프로세서 연결하기  (0) 2020.08.05
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday