[BOJ][๐ก4][๋ฐฑ์ค#22865] ๊ฐ์ฅ ๋จผ ๊ณณ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold IV
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
$N$๊ฐ์ ๋ ์ค์์ ํ ๊ณณ์ ์์ทจ๋ฅผ ํ๋ ค๊ณ ์ง์ ์์๋ณด๊ณ ์๋ค. ์ธ ๋ช ์ ์น๊ตฌ $A$, $B$, $C$๊ฐ ์๋๋ฐ ์ด ์น๊ตฌ๋ค์ ์ด๊ณ ์๋ ์ง์ผ๋ก๋ถํฐ ๊ฐ์ฅ ๋จผ ๊ณณ์ ์ง์ ๊ตฌํ๋ ค๊ณ ํ๋ค. ์ด๋, ๊ฐ์ฅ ๋จผ ๊ณณ์ ์ ํํ ย ์ง์์ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ๊ฐ๊น์ด ์น๊ตฌ์ ์ง๊น์ง์ย ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ๋จผ ๊ณณ์ ์๋ฏธํ๋ค. ์๋ฅผ ๋ค์ด, $X$ ์์น์ ์๋ ์ง์์ ์น๊ตฌ $A$, $B$, $C$์ ์ง๊น์ง์ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๊ฐ 3, 5, 4์ด๋ผ ๊ฐ์ ํ๊ณ $Y$ ์์น์ ์๋ ์ง์์ ์น๊ตฌ $A$, $B$, $C$์ ์ง๊น์ง์ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๊ฐ 5, 7, 2๋ผ๊ณ ํ์. ์ด๋, ์น๊ตฌ๋ค์ ์ง์ผ๋ก๋ถํฐ ๋ $X$์ ๋ $Y$ ์ค ๋ ๋จผ ๊ณณ์ $X$ ์์น์ ์๋ ์ง์ด ๋๋ค. ์๋ํ๋ฉด $X$์์ ๊ฐ์ฅ ๊ฐ๊น์ดย ์น๊ตฌ์ ์ง๊น์ง์ ๊ฑฐ๋ฆฌ๋ 3์ด๊ณ , $Y$์์๋ $2$์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์น๊ตฌ๋ค์ด ์ด๊ณ ์๋ ์ง์ผ๋ก๋ถํฐ ๊ฐ์ฅ ๋จผ ๊ณณ์ ๊ตฌํด๋ณด์.
์ ๋ ฅ
์ฒซ๋ฒ์งธ ์ค์ ์์ทจํ ๋ ํ๋ณด์ ๊ฐ์ $N$์ด ์ฃผ์ด์ง๋ค. 2๋ฒ์งธ ์ค์๋ ์น๊ตฌ $A$, $B$, $C$๊ฐ ์ฌ๋ ์์น๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค. ์ด๋ ์น๊ตฌ๋ค์ $N$๊ฐ์ ๋ ์ค ํ๋์ ์ฌ๋ ๊ฒ์ ๋ณด์ฅํ๋ค. (๊ฐ์ ์์น์์ ์ด ์ ์๋ค.) 3๋ฒ์งธ ์ค์๋ ๋ ๊ณผ ๋ ์ฌ์ด๋ฅผ ์๋ ๋๋ก์ ๊ฐ์ $M$์ด ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์์ค๋ถํฐ $M + 3$๋ฒ์งธ ์ค๊น์งย ๋ $D$, ๋ $E$, ๋ $D$์ ๋ $E$์ ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ๋๋ก์ ๊ธธ์ด $L$์ด ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ดย ์ฃผ์ด์ง๋ค. ์ด ๋๋ก๋ ์๋ฑกํญ ํตํ์ด ๊ฐ๋ฅํ๋ค.
์ถ๋ ฅ
์น๊ตฌ๋ค์ด ์ด๊ณ ์๋ ์ง์ผ๋ก๋ถํฐ ๊ฐ์ฅ ๋จผ ๊ณณ์ ๋ ๋ฒํธ๋ฅผ ์ถ๋ ฅํ๋ค. ๋ง์ฝ ๊ฐ์ฅ ๋จผ ๊ณณ์ด ์ฌ๋ฌ ๊ณณ์ด๋ผ๋ฉด ๋ฒํธ๊ฐ ๊ฐ์ฅ ์์ ๋ ์ ๋ฒํธ๋ฅผ ์ถ๋ ฅํ๋ค.
์ ํ
$ 1 โค N โค 100,000$ $N - 1 โค M โค 500,000$ $1 โค A, B, C, D, E โค N$ $1 โค L โค 10,000$
์์
์ ๋ ฅ
6
1 2 5
8
1 2 1
2 3 4
1 4 2
2 5 3
1 6 5
5 6 2
3 4 2
4 5 6
์ถ๋ ฅ
3
My Sol
import sys
input = sys.stdin.readline
from heapq import heappop, heappush
def main():
def make_rels():
rels = [[] for _ in range(N+1)]
M = int(input())
for _ in range(M):
u, v, w = map(int, input().split())
rels[u].append((v, w))
rels[v].append((u, w))
return rels
def find_max_len():
mi, mv = 0, 0
Ds = [find_max_len_sub(f) for f in friends]
for i in range(1, N+1):
smv = 1e9
for j in range(3):
smv = min(smv, Ds[j][i])
if Ds[j][i] == 1e9: continue
if smv > mv:
mi, mv = i, smv
return mi
def find_max_len_sub(n):
visited = [0]*(N+1)
D = [1e9 for _ in range(N+1)]
D[n] = 0
H = [(0, n)]
while H:
d, u = heappop(H)
if visited[u]: continue
visited[u] = 1
for v, w in rels[u]:
if visited[v]: continue
if D[v] > D[u]+w:
D[v] = D[u]+w
heappush(H, (D[v], v))
return D
N = int(input())
friends = set(map(int, input().split()))
rels = make_rels()
return find_max_len()
print(main())
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ๋ฌธ์ ์๋ค.
- ์
๋ ฅ์ ๋ฐ์ ๋
ธ๋๊ฐ ์ฃ์ง๋ฅผ ์ ์ฅํ๋ค.
make_rels
๋ผ๋ ํจ์๋ฅผ ์์ฑํด์ ๊ตฌํํ๋ค. - 3๋ช
์ ์น๊ตฌ๋ค์ ์์น๋ถํฐ ์์ํ์ฌ ์ ์ฒด ๋
ธ๋์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค.
find_max_len
์ด๋ผ๋ ํจ์๋ฅผ ์์ฑํ๋๋ฐ, ์ด๋find_max_len_sub
๋ผ๋ ํ์ ํจ์๋ฅผ ํตํดfriends
์ ๊ฐ ์์์ ์ผ๋ก๋ถํฐ์ ๋ชจ๋ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐ์, ๋ชจ๋ ์ ์ ์์ ๊ฑฐ๋ฆฌ๋ฅผ ์ฒดํฌํ์ฌ ๊ฐ์ฅ ๋จผ ๊ณณ์ ๋ ธ๋ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ ํจ์์ด๋ค. find_max_len_sub
ํจ์๋ ์ธ์๋ก ๋ฐ์n
์ผ๋ก๋ถํฐ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์คํํ์ฌ ๊ฐ ๋ ธ๋๋ง๋ค ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ค.main
ํจ์๋find_max_len
ํจ์์ ๋ฐํ๊ฐ์ ๋ฐํํ๊ณ , ์ด๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๊ฒ ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ