We will find a way, we always have.

-interstellar

Problem Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 1219๋ฒˆ: ์˜ค๋ฏผ์‹์˜ ๊ณ ๋ฏผ - ํŒŒ์ด์ฌ (๋ฒจ๋งŒ ํฌ๋“œ, BFS)

Redddy 2022. 8. 28. 13:54

๐Ÿ”ˆ ๋ฌธ์ œ

์˜ค๋ฏผ์‹์€ ์„ธ์ผ์ฆˆ๋งจ์ด๋‹ค. ์˜ค๋ฏผ์‹์˜ ํšŒ์‚ฌ ์‚ฌ์žฅ๋‹˜์€ ์˜ค๋ฏผ์‹์—๊ฒŒ ๋ฌผ๊ฑด์„ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ํŒ”์•„์„œ ์ตœ๋Œ€ ์ด์œค์„ ๋‚จ๊ธฐ๋ผ๊ณ  ํ–ˆ๋‹ค.

์˜ค๋ฏผ์‹์€ ๊ณ ๋ฏผ์— ๋น ์กŒ๋‹ค.์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ตœ๋Œ€ ์ด์œค์„ ๋‚ผ ์ˆ˜ ์žˆ์„๊นŒ?

์ด ๋‚˜๋ผ์—๋Š” N๊ฐœ์˜ ๋„์‹œ๊ฐ€ ์žˆ๋‹ค. ๋„์‹œ๋Š” 0๋ฒˆ๋ถ€ํ„ฐ N-1๋ฒˆ๊นŒ์ง€ ๋ฒˆํ˜ธ ๋งค๊ฒจ์ ธ ์žˆ๋‹ค. ์˜ค๋ฏผ์‹์˜ ์—ฌํ–‰์€ A๋„์‹œ์—์„œ ์‹œ์ž‘ํ•ด์„œ B๋„์‹œ์—์„œ ๋๋‚œ๋‹ค.์˜ค๋ฏผ์‹์ด ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ตํ†ต์ˆ˜๋‹จ์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ์˜ค๋ฏผ์‹์€ ๋ชจ๋“  ๊ตํ†ต์ˆ˜๋‹จ์˜ ์ถœ๋ฐœ ๋„์‹œ์™€ ๋„์ฐฉ ๋„์‹œ๋ฅผ ์•Œ๊ณ  ์žˆ๊ณ , ๋น„์šฉ๋„ ์•Œ๊ณ  ์žˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€, ์˜ค๋ฏผ์‹์€ ๊ฐ๊ฐ์˜ ๋„์‹œ๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค ๋ฒŒ ์ˆ˜ ์žˆ๋Š” ๋ˆ์„ ์•Œ๊ณ ์žˆ๋‹ค. ์ด ๊ฐ’์€ ๋„์‹œ๋งˆ๋‹ค ๋‹ค๋ฅด๋ฉฐ, ์•ก์ˆ˜๋Š” ๊ณ ์ •๋˜์–ด์žˆ๋‹ค. ๋˜, ๋„์‹œ๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค ๊ทธ ๋ˆ์„ ๋ฒŒ๊ฒŒ ๋œ๋‹ค.

์˜ค๋ฏผ์‹์€ ๋„์ฐฉ ๋„์‹œ์— ๋„์ฐฉํ•  ๋•Œ, ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ˆ์˜ ์•ก์ˆ˜๋ฅผ ์ตœ๋Œ€๋กœ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ด ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์˜ค๋ฏผ์‹์ด ๋ฒ„๋Š” ๋ˆ๋ณด๋‹ค ์“ฐ๋Š” ๋ˆ์ด ๋งŽ๋‹ค๋ฉด, ๋„์ฐฉ ๋„์‹œ์— ๋„์ฐฉํ•  ๋•Œ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ˆ์˜ ์•ก์ˆ˜๊ฐ€ ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ๋˜, ๊ฐ™์€ ๋„์‹œ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ ๋„์‹œ๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค ๋ˆ์„ ๋ฒŒ๊ฒŒ ๋œ๋‹ค. ๋ชจ๋“  ๊ตํ†ต ์ˆ˜๋‹จ์€ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ ๋ฒˆ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

๐Ÿ“์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋„์‹œ์˜ ์ˆ˜ N๊ณผ ์‹œ์ž‘ ๋„์‹œ, ๋„์ฐฉ ๋„์‹œ ๊ทธ๋ฆฌ๊ณ  ๊ตํ†ต ์ˆ˜๋‹จ์˜ ๊ฐœ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์—๋Š” ๊ตํ†ต ์ˆ˜๋‹จ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ตํ†ต ์ˆ˜๋‹จ์˜ ์ •๋ณด๋Š” “์‹œ์ž‘ ๋ ๊ฐ€๊ฒฉ”๊ณผ ๊ฐ™์€ ํ˜•์‹์ด๋‹ค. ๋งˆ์ง€๋ง‰ ์ค„์—๋Š” ์˜ค๋ฏผ์‹์ด ๊ฐ ๋„์‹œ์—์„œ ๋ฒŒ ์ˆ˜ ์žˆ๋Š” ๋ˆ์˜ ์ตœ๋Œ“๊ฐ’์ด 0๋ฒˆ ๋„์‹œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค.

N๊ณผ M์€ 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๊ณ , ๋ˆ์˜ ์ตœ๋Œ“๊ฐ’๊ณผ ๊ตํ†ต ์ˆ˜๋‹จ์˜ ๊ฐ€๊ฒฉ์€ 1,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์Œ์ด ์•„๋‹Œ ์ •์ˆ˜์ด๋‹ค.

 

๐Ÿ“‘์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋„์ฐฉ ๋„์‹œ์— ๋„์ฐฉํ•  ๋•Œ, ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ˆ์˜ ์•ก์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ์˜ค๋ฏผ์‹์ด ๋„์ฐฉ ๋„์‹œ์— ๋„์ฐฉํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•  ๋•Œ๋Š” "gg"๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ , ์˜ค๋ฏผ์‹์ด ๋„์ฐฉ ๋„์‹œ์— ๋„์ฐฉํ–ˆ์„ ๋•Œ ๋ˆ์„ ๋ฌดํ•œํžˆ ๋งŽ์ด ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด "Gee"๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿ“š ๋ฌธ์ œ ํ’€์ด

A์—์„œ B๋กœ ๊ฐ€๋Š” ๊ตํ†ต๋น„๋ณด๋‹ค B์— ๋ฐฉ๋ฌธํ–ˆ์„ ์‹œ์— ์–ป๋Š” ๋ˆ์ด ๋” ๋งŽ๊ณ  ์ด ๋‘˜ ์‚ฌ์ด์— ์‚ฌ์ดํด์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ˆ์„ ๋ฌดํ•œํžˆ ๋งŽ์ด ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ Gee๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ๋„์ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์—†๋‹ค๋ฉด gg๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ๋‚˜๋จธ์ง€ ๊ฒฝ์šฐ์—๋Š” ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ˆ์˜ ์•ก์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ฉด ๋˜์—ˆ๋‹ค.

 

์‚ฌ์ดํด์˜ ์กด์žฌ์˜ ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐ”๋กœ ๋ฒจ๋งŒ ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๋ฒจ๋งŒ ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ‘ผ ์†Œ์Šค์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

๐Ÿ’ป ์ฝ”๋“œ_1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import sys
input = sys.stdin.readline
INF = -int(1e9# ์Œ์˜ ๋ฌดํ•œ
def bellman(start,end):
    dist = [INF for _ in range(n)] # ์ดˆ๊ธฐ๋ฐฐ์—ด
    dist[start] = money[start] # ๊ฐ€๋งŒํžˆ ์žˆ๋Š”๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด 0์ด ์•„๋‹Œ money[start]๋กœ ์ดˆ๊ธฐํ™”
    
    for i in range(n-1):
        for u,v,w in city: # ํ•œ๋ฐ”ํ€ด ๋Œ์•„์„œ ๊ฐฑ์‹ 
            if dist[u] != INF and dist[u] + w > dist[v]:
                dist[v] = dist[u] + w
    
    if dist[end] == INF: # ๋„์ฐฉ๋ถˆ๊ฐ€๋Šฅ gg
        return 'gg'
    
    # ํ•œ๋ฒˆ ๋” ๋Œ์•˜์„ ๋•Œ ์‚ฌ์ดํด์ด ์ƒ๊ธด๋‹ค๋ฉด Gee
    for u,v,w in city:
        if dist[u] != INF and dist[u] + w > dist[v]:
            if money[end] != dist[end]:
                return 'Gee'
 
    # ์ตœ๋Œ€๋จธ๋‹ˆ ๋ฆฌํ„ด        
    return dist[end]
n,start,end,m = map(int,input().split()) # ๋…ธ๋“œ๊ฐœ์ˆ˜, ์‹œ์ž‘, ๋, ๊ฐ„์„ ๊ฐœ์ˆ˜
city = []
for _ in range(m):
    a,b,c = map(int,input().split()) # ์‹œ์ž‘, ๋, ๊ตํ†ต๋น„
    city.append([a,b,-c]) # ๊ตํ†ต๋น„๋Š” ์Œ์ˆ˜๋กœ
money = list(map(int,input().split())) # ๋ฐฉ๋ฌธ์‹œ ์–ป๋Š” ๋ˆ ์ž…๋ ฅ๋ฐ›์Œ
for i in range(m):
    city[i][2= city[i][2]+money[city[i][1]] # ๊ตํ†ต๋น„+๋ฐฉ๋ฌธ์‹œ ์–ป๋Š” ๋ˆ
print(bellman(start,end))
cs

 

๋ฌดํ•œ ๊ฐ’์„ ์Œ์˜ ๋ฌดํ•œ์œผ๋กœ ํ•˜์˜€๊ณ , A๋กœ ๊ฐ€๋Š” ๊ตํ†ต๋น„์— A ๋ฐฉ๋ฌธ์‹œ ์–ป๋Š” ๋น„์šฉ์„ ๋”ํ•ด์ค€ ๋’ค ๋ฒจ๋งŒ ํฌ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜์˜€๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค ํŒ์ •์ด ๋‚˜์™”๋‹ค. ์ด์œ ๋Š” ์‚ฌ์ดํด์ด ์ƒ๊ฒผ์„ ๋•Œ์ธ๋ฐ, ์‚ฌ์ดํด์ด ์ƒ๊ฒจ๋„ ๊ทธ ์‚ฌ์ดํด์—์„œ ๋„์ฐฉ์ง€์ ์— ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฒดํฌํ•ด์ฃผ์ง€ ๋ชปํ•œ์ฑ„ ๊ทธ๋ƒฅ ์‚ฌ์ดํด์ด ์ƒ๊ธฐ๋ฉด Gee๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ์—ˆ๋‹ค.

์ฆ‰ C์™€ D์—์„œ ๋บ‘๋บ‘์ด ๋Œ๋ ค์„œ ๋ˆ์„ ๋ฌด์ˆ˜ํžˆ ๋งŽ์ด ๋งŒ๋“ค์–ด๋„ C๋‚˜ D์—์„œ ๋„์ฐฉ์ง€์ ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋ฉด ์†Œ์šฉํžˆ ์—†๋Š” ๊ฒƒ์ด๋‹ค.

 

์˜ˆ์™ธ ์ผ€์ด์Šค
4 0 3 4
0 1 0
1 2 0
2 1 0
0 3 10
10 10 10 10

 

๊ทธ๋ฆผ์œผ๋กœ ๋ณด๋ฉด ์กฐ๊ธˆ ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

1๋ฒˆ๊ณผ 2๋ฒˆ์˜ ์‚ฌ์ดํด์ด ์ƒ๊ฒผ์ง€๋งŒ 1๋ฒˆ์ด๋‚˜ 2๋ฒˆ์—์„œ ๋„์ฐฉ์ง€์ ์ธ 3๋ฒˆ์— ๊ฐˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœํžˆ ์‚ฌ์ดํด ์ฒดํฌ ํ›„์— Gee๋ฅผ ์ถœ๋ ฅํ• ๊ฒŒ ์•„๋‹ˆ๋ผ ๊ทธ ์‚ฌ์ดํด์—์„œ ๋„์ฐฉ์ง€์ ์— ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด๋ด์•ผ ํ•˜์˜€๋‹ค. ์ด ๋ถ€๋ถ„์€ ์ถ”๊ฐ€๋กœ BFS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

 

๐Ÿ’ป ์ฝ”๋“œ_2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
from collections import deque
import sys
input = sys.stdin.readline
INF = -int(1e9# ์Œ์˜ ใ…œํ•œ
def bellman(start,end):
    dist = [INF for _ in range(n)] # ์ดˆ๊ธฐ๋ฐฐ์—ด
    dist[start] = money[start] # ๊ฐ€๋งŒํžˆ ์žˆ๋Š”๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด 0์ด ์•„๋‹Œ money[start]๋กœ ์ดˆ๊ธฐํ™”
    
    for i in range(n-1):
        for u,v,w in city: # ํ•œ๋ฐ”ํ€ด ๋Œ์•„์„œ ๊ฐฑ์‹ 
            if dist[u] != INF and dist[u] + w > dist[v]:
                dist[v] = dist[u] + w
    
    if dist[end] == INF: # ๋„์ฐฉ๋ถˆ๊ฐ€๋Šฅ gg
        return 'gg'
    
    # print(city, dist)
    # ํ•œ๋ฒˆ ๋” ๋Œ์•˜์„ ๋•Œ ์‚ฌ์ดํด์ด ์ƒ๊ธด๋‹ค๋ฉด Gee
    for u,v,w in city:
        # print(dist[u], w, dist[v])
        if dist[u] != INF and dist[u] + w > dist[v]:
            if bfs(v,end):
                return 'Gee'
            else:
                pass
 
    # ์ตœ๋Œ€๋จธ๋‹ˆ ๋ฆฌํ„ด        
    return dist[end]
 
 
def bfs(start, end):
    q = deque()
    q.append(start)
    visited = [False]*(n)
    visited[start] = True
    while q:
        now = q.popleft()
        if now == end:
            return True
        for a,b,c in city:
            if a==now:
                if not visited[b]:
                    visited[b] = True
                    q.append(b)
    
    return False
 
 
n,start,end,m = map(int,input().split()) # ๋…ธ๋“œ๊ฐœ์ˆ˜, ์‹œ์ž‘, ๋, ๊ฐ„์„ ๊ฐœ์ˆ˜
city = []
for _ in range(m):
    a,b,c = map(int,input().split()) # ์‹œ์ž‘, ๋, ๊ตํ†ต๋น„
    city.append([a,b,-c]) # ๊ตํ†ต๋น„๋Š” ์Œ์ˆ˜๋กœ
money = list(map(int,input().split())) # ๋ฐฉ๋ฌธ์‹œ ์–ป๋Š” ๋ˆ ์ž…๋ ฅ๋ฐ›์Œ
for i in range(m):
    city[i][2= city[i][2]+money[city[i][1]] # ๊ตํ†ต๋น„+๋ฐฉ๋ฌธ์‹œ ์–ป๋Š” ๋ˆ
 
print(bellman(start,end))
cs

 

๐Ÿญ ์‹œํ–‰์ฐฉ์˜ค

๐Ÿ”— ๋ฌธ์ œ๋งํฌ ์˜ค๋ฏผ์‹์˜ ๊ณ ๋ฏผ

 

1219๋ฒˆ: ์˜ค๋ฏผ์‹์˜ ๊ณ ๋ฏผ

์ฒซ์งธ ์ค„์— ๋„์ฐฉ ๋„์‹œ์— ๋„์ฐฉํ•  ๋•Œ, ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ˆ์˜ ์•ก์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ์˜ค๋ฏผ์‹์ด ๋„์ฐฉ ๋„์‹œ์— ๋„์ฐฉํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•  ๋•Œ๋Š” "gg"๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ , ์˜ค๋ฏผ์‹์ด ๋„์ฐฉ ๋„์‹œ์— ๋„์ฐฉ

www.acmicpc.net