๐ ๋ฌธ์
์ค๋ฏผ์์ ์ธ์ผ์ฆ๋งจ์ด๋ค. ์ค๋ฏผ์์ ํ์ฌ ์ฌ์ฅ๋์ ์ค๋ฏผ์์๊ฒ ๋ฌผ๊ฑด์ ์ต๋ํ ๋ง์ด ํ์์ ์ต๋ ์ด์ค์ ๋จ๊ธฐ๋ผ๊ณ ํ๋ค.
์ค๋ฏผ์์ ๊ณ ๋ฏผ์ ๋น ์ก๋ค.์ด๋ป๊ฒ ํ๋ฉด ์ต๋ ์ด์ค์ ๋ผ ์ ์์๊น?
์ด ๋๋ผ์๋ 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 |
๐ญ ์ํ์ฐฉ์ค
๐ ๋ฌธ์ ๋งํฌ ์ค๋ฏผ์์ ๊ณ ๋ฏผ
'Problem Solving > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 5427๋ฒ: ๋ถ - ํ์ด์ฌ (0) | 2022.09.11 |
---|---|
[๋ฐฑ์ค] 2174๋ฒ: ๋ก๋ด ์๋ฎฌ๋ ์ด์ - ํ์ด์ฌ (0) | 2022.09.04 |
[๋ฐฑ์ค] 1016๋ฒ: ์ ๊ณฑใดใด์ - ํ์ด์ฌ (0) | 2022.08.27 |
[๋ฐฑ์ค] 1041๋ฒ: ์ฃผ์ฌ์ - ํ์ด์ฌ (0) | 2022.08.20 |
[๋ฐฑ์ค] 1865๋ฒ: ์ํ - ํ์ด์ฌ (2) | 2022.08.06 |