🧩 Problem Solving/[λ°±μ€€]

[λ°±μ€€] 14938 μ„œκ°•κ·ΈλΌμš΄λ“œ (python 파이썬)

μ œλ΄‰μ•„ 2022. 9. 10. 21:41

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

 

14938번: μ„œκ°•κ·ΈλΌμš΄λ“œ

μ˜ˆμ€μ΄λŠ” μš”μ¦˜ κ°€μž₯ 인기가 μžˆλŠ” κ²Œμž„ μ„œκ°•κ·ΈλΌμš΄λ“œλ₯Ό 즐기고 μžˆλ‹€. μ„œκ°•κ·ΈλΌμš΄λ“œλŠ” μ—¬λŸ¬ 지역쀑 ν•˜λ‚˜μ˜ 지역에 λ‚™ν•˜μ‚°μ„ 타고 λ‚™ν•˜ν•˜μ—¬, κ·Έ 지역에 λ–¨μ–΄μ Έ μžˆλŠ” μ•„μ΄ν…œλ“€μ„ μ΄μš©ν•΄ μ„œλ°”μ΄λ²Œμ„

www.acmicpc.net


쑰건만 잘 μƒκ°ν•˜λ©΄ λ˜λŠ” μ°©ν•œ 문제.


아이디어

1. λ‹€μ΅μŠ€νŠΈλΌ

  • μΆœλ°œμ§€λ‘œ λΆ€ν„° μ΅œλ‹¨κ±°λ¦¬λ₯Ό κ³„μ‚°ν•΄μ„œ μˆ˜μƒ‰ λ²”μœ„μ•ˆμ— λ“€μ–΄κ°€λŠ”μ§€ ν™•μΈν•˜λ©΄ λœλ‹€.
  • μˆ˜μƒ‰ λ²”μœ„μ•ˆμ— λ“€μ–΄μ˜€λ©΄ μ•„μ΄ν…œ 개수λ₯Ό 더해주면 λœλ‹€.
  • 1 ~ nκΉŒμ§€ for문으둜 μΆœλ°œμ§€λ₯Ό λ°”κΎΈλ©΄μ„œ νƒμƒ‰ν•˜λ©΄ λœλ‹€.

2. ν”Œλ‘œμ΄λ“œ μ›Œμ…œ

  • μ§€μ—­μ˜ 개수(100)κ°€ μ μœΌλ―€λ‘œ ν”Œλ‘œμ΄λ“œ μ›Œμ…œλ‘œ 풀어도 μ‹œκ°„μ΄ˆκ³Όμ— 걸리지 μ•ŠλŠ”λ‹€.

전체 μ½”λ“œ

λ‹€μ΅μŠ€νŠΈλΌ

import heapq
import sys
INF = int(1e9)
n, m, r = map(int, input().split())

items = [0] + [int(x) for x in sys.stdin.readline().split()]

graph = [[] for _ in range(n + 1)]

for _ in range(r):
    a, b, l = map(int, sys.stdin.readline().split())
    graph[a].append([b, l])
    graph[b].append([a, l])

def dijkstra(start):
    que = []
    heapq.heappush(que, (0, start))
    D[start] = 0

    while que:
        dist, now = heapq.heappop(que)
        if D[now] < dist:
            continue

        for i in graph[now]:
            cost = dist + i[1]
            if cost < D[i[0]]:
                D[i[0]] = cost
                heapq.heappush(que, (cost, i[0]))

ans = 0
for i in range(1, n + 1):
    D = [INF] * (n + 1)
    dijkstra(i)
    tmp = 0
    for d in range(1, n + 1):
        if m >= D[d]:
            tmp += items[d]

    ans = max(ans, tmp)

print(ans)

 

ν”Œλ‘œμ΄λ“œ μ›Œμ…œ

import sys
INF = int(1e9)
n, m, r = map(int, input().split())

items = [0] + [int(x) for x in sys.stdin.readline().split()]

graph = [[INF] * (n + 1) for _ in range(n + 1)]

for _ in range(r):
    a, b, l = map(int, sys.stdin.readline().split())
    graph[a][b] = l
    graph[b][a] = l

for i in range(n + 1):
    graph[i][i] = 0

for k in range(1, n + 1):
    for i in range(1, n + 1):
        for j in range(1, n + 1):
            graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j])

ans = 0
for i in range(1, n + 1):
    tmp = 0
    for j in range(1, n + 1):
        if graph[i][j] <= m:
            tmp += items[j]

    ans = max(ans, tmp)

print(ans)

 


μ½”λ“œ μ„€λͺ…

λ‹€μ΅μŠ€νŠΈλΌ

ans = 0
for i in range(1, n + 1):
    D = [INF] * (n + 1)
    dijkstra(i)
    tmp = 0
    for d in range(1, n + 1):
        if m >= D[d]:
            tmp += items[d]

    ans = max(ans, tmp)

print(ans)

for문을 μ‚¬μš©ν•΄μ„œ 각 μΆœλ°œμ§€ λ§ˆλ‹€ μ–Όλ§ˆλ‚˜ μ•„μ΄ν…œμ„ λͺ¨μ„ 수 μžˆλŠ”μ§€ κ³„μ‚°ν•œλ‹€.

 

μ €μž₯ν•œ μ΅œλŒ“κ°’μ„ 좜λ ₯ν•΄μ£Όλ©΄ λœλ‹€.

 

ν”Œλ‘œμ΄λ“œ μ›Œμ…œ

ans = 0
for i in range(1, n + 1):
    tmp = 0
    for j in range(1, n + 1):
        if graph[i][j] <= m:
            tmp += items[j]

    ans = max(ans, tmp)

μœ„μ™€ 방식은 λ˜‘κ°™λ‹€.