[BOJ] 16118. ๋‹ฌ๋น›์—ฌ์šฐ (๐Ÿฅ‡, ๋‹ค์ต์ŠคํŠธ๋ผ)

lemythe423ยท2023๋…„ 9์›” 13์ผ
0

BOJ ๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
46/133
post-thumbnail

๐Ÿ”—

ํ’€์ด

์—ฌ์šฐ์™€ ๋Š‘๋Œ€๊ฐ€ ๊ฐ๊ฐ์˜ ๊ทธ๋ฃจํ„ฐ๊ธฐ์— ์ตœ๋‹จ ์‹œ๊ฐ„์œผ๋กœ ๋„์ฐฉํ•˜๊ณ  ๋„์ฐฉํ•œ ์‹œ๊ฐ„๋“ค ์ค‘์—์„œ ์—ฌ์šฐ๊ฐ€ ๋Š‘๋Œ€๋ณด๋‹ค ๋นจ๋ฆฌ ๋„์ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋ฃจํ„ฐ๊ธฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ๊ทธ๋ฃจํ„ฐ๊ธฐ๋ฅผ ํ•˜๋‚˜์˜ ์ •์ ์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ์—ฌ์šฐ์™€ ๋Š‘๋Œ€๊ฐ€ ์ถœ๋ฐœํ•˜๋Š” ์ง€์ ์ด 1์ด๋ผ๋ฉด 1์—์„œ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํ’€์ดํ–ˆ๋‹ค.

์—ฌ์šฐ์˜ ์ด๋™ ์†๋„๋Š” ํ•ญ์ƒ ์ผ์ •ํ•˜๋‹ค๊ณ  ํ–ˆ์œผ๋ฏ€๋กœ ์ผ๋ฐ˜์ ์ธ ๋‹ค์ต์ŠคํŠธ๋ผ ํ’€์ด๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋Š‘๋Œ€์˜ ๊ฒฝ์šฐ๋Š” ํ•œ ๋ฒˆ์€ 2๋ฐฐ์˜ ์†๋„๋กœ, ๊ทธ ๋‹ค์Œ์€ 1/2์†๋„๋กœ ์ด๋™ํ•˜๋Š” ์ฐจ์ด๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ด ๋ง์€ A์—์„œ B๋ผ๋Š” ์ •์ ์œผ๋กœ 1ํšŒ์ฐจ์— ๋ฐฉ๋ฌธํ•  ๋•Œ๋Š” 2๋ฐฐ์†์œผ๋กœ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋˜์ง€๋งŒ, 2ํšŒ์ฐจ์— ๋ฐฉ๋ฌธํ•  ๋•Œ๋Š” 1/2์†๋„๋กœ ๋” ๋Š๋ฆฌ๊ฒŒ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๋Š” ๋ง์ด ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ ๋‹จ์ˆœํžˆ ๋” ๋Šฆ๊ฒŒ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์œผ๋ฉด ์œ„์˜ ๊ทธ๋ž˜ํ”„์—์„œ ์ œ๋Œ€๋กœ ๋œ ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. ์ •์  2์— ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 1->2์™€ 1->3->2 ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ํ•ญ์ƒ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ถ€ํ„ฐ ๊ตฌํ•ด๋‚˜๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์ถœ๋ฐœ์ ๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ(1->2)์™€ ๊ทธ ๋‹ค์Œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ์˜ ์ •์ ์—์„œ ์—ฐ๊ฒฐ๋œ ์ •์ ์—์„œ ๊ตฌํ•ด์ง€๋Š” ๊ฒฝ์šฐ(1->3->2)๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 1->2์˜ ๊ฒฝ์šฐ 1ํšŒ์ฐจ์ด๊ธฐ ๋•Œ๋ฌธ์— 2๋ฐฐ์˜ ์†๋„๋กœ ์ด๋™ํ•ด์„œ 1.5์˜ ์ด๋™๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค. 1->3->2๋Š” 2ํšŒ์ฐจ์ด๊ธฐ ๋•Œ๋ฌธ์— 1->3์€ 1์ด์ง€๋งŒ 3->2๋Š” 1/2์†๋„๊ฐ€ ๋˜์–ด 4์ด๋ฏ€๋กœ ํ•ฉ์ณ์„œ 5๊ฐ€ ๋œ๋‹ค. ์ด๋ฏธ 1ํšŒ์ฐจ์˜ ์ด๋™์œผ๋กœ 1.5๋งŒ์— ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ •์ 2๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ 5๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ์†๋„๋ฅผ ๊ตณ์ด ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ ์‹ถ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋Š” ์ •์ 4๊นŒ์ง€ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•  ๋•Œ ์ƒ๊ฒผ๋‹ค. 1 3 2๋กœ 2ํšŒ ์ด๋™ํ•œ ๊ฒฝ์šฐ๋Š” 2->4๋กœ ์ด๋™ํ•  ๋•Œ 3ํšŒ์ฐจ๊ฐ€ ๋˜์–ด 4์˜ ์ ˆ๋ฐ˜์ธ 2๋งŒํผ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ 1 2๋กœ ์ด๋™ํ•œ ๊ฒฝ์šฐ๋Š” 2->4์˜ ์ด๋™์ด 3ํšŒ์ฐจ๊ฐ€ ๋˜์–ด 4์˜ 2๋ฐฐ์ธ 8๋งŒํผ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

๊ฒฐ๊ตญ ๊ฐ๊ฐ์˜ ์ •์ ์— ํ™€์ˆ˜/์ง์ˆ˜ ํšŒ์ฐจ์— ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ ๊ฑธ๋ฆฌ๋Š” ๊ฐ๊ฐ์˜ ์ตœ๋‹จ์‹œ๊ฐ„์„ ๋ชจ๋‘ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค. 2๊ฐœ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์„ 2์ฐจ์›์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

๋ฌธ์ œ ์‚ฌํ•ญ

5 5
1 2 1
2 3 1
1 3 1
1 4 1
4 5 10000

์œ„์˜ ๋…ผ๋ฆฌ๋Œ€๋กœ ํ’€์ดํ–ˆ์ง€๋งŒ 57%์ฏค์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์งˆ๋ฌธ ๊ฒŒ์‹œํŒ์—์„œ ์œ„์˜ ๋ฐ˜๋ก€๋ฅผ ์ฐพ์•˜๋‹ค. ๋ฌธ์ œ๋Š” ์ถœ๋ฐœ์ ์œผ๋กœ ๋‹ค์‹œ ๋˜๋Œ์•„์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜๋˜ ์ ์ด์—ˆ๋‹ค. ์ถœ๋ฐœ์ ์—์„œ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” 0ํšŒ์ฐจ์— ํ•ด๋‹นํ•œ๋‹ค. ๋‹ค๋ฅธ ์ •์ ์— ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ๋Œ์•„์˜ค๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด์ค˜์•ผ ํ–ˆ๋Š”๋ฐ ์ด๊ฑธ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ๋ฏธ๋ฆฌ 0์œผ๋กœ ๋‹คํ•ด์„œ ์žฌ๋ฐฉ๋ฌธ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ–ˆ๋˜ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์œ„์˜ ๋ฐ˜๋ก€์—์„œ 1->3->1->4์™€ ๊ฐ™์ด ๋ฐฉ๋ฌธํ•  ์ˆ˜๊ฐ€ ์—†๊ฒŒ ๋˜๊ณ , 4->5๊ฐ€ ์ง์ˆ˜ ํšŒ์ฐจ์— ๋‹น์ฒจ๋˜์–ด 2๋งŒ ์‹œ๊ฐ„์ด ๋„˜๊ฒŒ ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค.

import sys
from collections import defaultdict
from heapq import heappop, heappush
input = sys.stdin.readline

# ๋Š‘๋Œ€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ
def move_wolf(n, graph):
    dist = [[1e9, 1e9] for _ in range(n+1)]
    dist[1][0] = 0

    pq = [(0, 1, 0)]
    while pq:
        w, i, v = heappop(pq)
        if dist[i][v] != w:
            continue
        
        if v == 0:
            for j, _w in graph[i]:
                cost = w+_w/2
                if dist[j][1] > cost:
                    heappush(pq, (cost, j, 1))
                    dist[j][1] = cost
        else:
            for j, _w in graph[i]:
                cost = w + _w*2
                if dist[j][0] > cost:
                    heappush(pq, (cost, j, 0))
                    dist[j][0] = cost
    return list(map(min, dist[1:]))

# ์—ฌ์šฐ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ
def move_fox(n, graph):
    dist = [1e9]*(n+1)
    dist[1] = 0

    pq = [(0, 1)]
    while pq:
        w, i = heappop(pq)
        if dist[i] != w:
            continue

        for j, _w in graph[i]:
            cost = w+_w
            if dist[j] > cost:
                dist[j] = cost
                heappush(pq, (cost, j))

    return dist[1:]

n, m = map(int, input().strip().split())
graph = defaultdict(list)
for _ in range(m):
    a, b, d = map(int, input().strip().split())
    graph[a].append([b, d])
    graph[b].append([a, d])

answer = 0
wolf, fox = move_wolf(n, graph), move_fox(n, graph)
for i in range(n):
    if fox[i] < wolf[i]:
        answer += 1
print(answer)
profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€