๊ด€๋ฆฌ ๋ฉ”๋‰ด

DOing

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ with Python ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ with Python

mangdo 2021. 5. 23. 18:27

๐Ÿ’ก ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๊ทธ๋ž˜์„œ '๊ธธ์ฐพ๊ธฐ'๋ฌธ์ œ๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค. ํ•™๋ถ€ ์ˆ˜์ค€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜, ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ, ๋ฒจ๋งŒ ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ ‡๊ฒŒ 3๊ฐ€์ง€์ด๋‹ค. ์ด ์ค‘ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ ๋‹ค๋ค„๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๐Ÿ’ก ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ 'ํ•œ ์ง€์ '์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์˜€๋‹ค. ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ '๋ชจ๋“  ๋…ธ๋“œ'์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๋ชจ๋‘ ๊ณ„์‚ฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. 

 ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ N์ด๋ผ๊ณ  ํ• ๋•Œ N๋ฒˆ๋งŒํผ์˜ ๋‹จ๊ณ„๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉฐ '์ ํ™”์‹'์— ๋งž๊ฒŒ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐฑ์‹ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ตฌํ˜„ ๋‚œ์ด๋„๊ฐ€ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ณด๋‹ค ์‰ฝ์ง€๋งŒ, ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(N^3)์ด๊ธฐ ๋•Œ๋ฌธ์— ๋…ธ๋“œ์™€ ๊ฐ„์„  ์ˆ˜๊ฐ€ ์ž‘์„ ๋•Œ๋งŒ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. (๋…ธ๋“œ์˜ ๊ฐฏ์ˆ˜๊ฐ€ ์•ฝ 500๊ฐœ ์ดํ•˜์ผ๋•Œ๋งŒ ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค.)

๐Ÿ’ก ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋™์ž‘ ๊ณผ์ •

  ๊ฐ ๋‹จ๊ณ„์—์„œ๋Š” ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ๊ฐ€๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด k๋ฒˆ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ํ™•์ธํ•  ๋•Œ๋Š” k๋ฒˆ ๋…ธ๋“œ๋ฅผ ์ค‘๊ฐ„์— ๊ฑฐ์ณ ์ง€๋‚˜๊ฐ€๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜๋ฉด๋œ๋‹ค. ์ด๋ฅผ ์ ํ™”์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

D(a,b) = min(D(a,b), D(a,k)+D(k,b))

์ ํ™”์‹์„ ์˜๋ฏธํ•˜๋Š” ๋‚ด์šฉ์„ ํ’€์–ด์„œ ์„ค๋ช…ํ•˜๋ฉด (a์—์„œ b๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ, a์—์„œ k๋ฅผ ๊ฑฐ์ณ์„œ b๋กœ ๊ฐ€๋Š” ๊ฑฐ๋ฆฌ)๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋” ์ž‘์€ ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ ํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, k๋ฅผ ๊ฑฐ์ณ๊ฐ€๋Š” ๊ฒƒ์ด ๋น ๋ฅด๋‹ค๋ฉด ์ตœ๋‹จ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๊ฐฑ์‹ ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

 

[step0]

์ฃผ์–ด์ง„ ์—ฐ๊ฒฐ์ •๋ณด๋ฅผ ์ด์šฉํ•ด์„œ ํ…Œ์ด๋ธ”์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ผ๋ฉด ๊ทธ ๋น„์šฉ์„ ๊ฐ’์œผ๋กœ ๋„ฃ๊ณ  ์ธ์ ‘ํ•œ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋ฌดํ•œ์ด๋ผ๋Š” ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค. 

[step1]

1๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๊ฐ€๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•œ๋‹ค. 

์ •ํ™•ํžˆ 3*2=6๊ฐ€์ง€ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ๋งŒ ๊ณ ๋ คํ•˜๋ฉด๋œ๋‹ค. 

6๊ฐ€์ง€ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ ์ ํ™”์‹์„ ๊ณ„์‚ฐํ•œ๋‹ค. 

D(2,3) = min(D(2,3), D(2,1)+D(1,3)) = min(7, 3+INF)

D(2,4) = min(D(2,4), D(2,1)+D(1,4)) = min(INF, 3+6)

D(3,2) = min(D(3,2), D(3,1)+D(1,2)) = min(INF, 5+4)

D(3,4) = min(D(3,4), D(3,1)+D(1,4)) = min(4, 5+6)

D(4,2) = min(D(4,2), D(4,1)+D(1,2)) = min(INF, INF+4)

D(4,3) = min(D(4,3), D(4,1)+D(1,3)) = min(2, INF+INF)

[step2]

2๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๊ฐ€๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•œ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 3*2=6๊ฐ€์ง€ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ ์ ํ™”์‹์„ ๊ณ„์‚ฐํ•œ๋‹ค. 

๋งˆ์ฐฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋…ธ๋“œ3, ๋…ธ๋“œ4์— ๋Œ€ํ•ด์„œ๋„ ๋ฐ˜๋ณตํ•œ๋‹ค. ์ตœ์ข…๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ด 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ”๋Š” D(2,3)=7, 2๋ฒˆ ๋…ธ๋“œ์—์„œ 3๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ 7์ž„์„ ์˜๋ฏธํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ '๋ชจ๋“  ๋…ธ๋“œ'์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๋ชจ๋‘ ๊ณ„์‚ฐํ•˜์—ฌ 2์ฐจ์›๋ฆฌ์ŠคํŠธ๋กœ ์ €์žฅํ•˜์˜€๋‹ค.

 

๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฒฝ๋กœ

๐Ÿ’ก ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„

INF = int(1e9) # ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต ์„ค์ •

# ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜, ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
n, m = map(int, input().split())

# ์ตœ๋‹จ๊ฒฝ๋กœ ๋ฆฌ์ŠคํŠธ
# ๋…ธ๋“œ๋ฒˆํ˜ธ๊ฐ€ 1๋ฒˆ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ(n+1)๋กœ ์„ค์ •
graph = [[INF]*(n+1) for _ in range(n+1)]

# ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
for a in range(1, n+1):
  for b in range(1,n+1):
    if a==b:
      graph[a][b] = 0

# ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ๊ทธ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”
for _ in range(m):
  # A์—์„œ B๋กœ ๊ฐ€๋Š” ๋น„์šฉ์€ C
  a,b,c = map(int, input().split())
  graph[a][b] = c

# ์ ํ™”์‹์— ๋”ฐ๋ผ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰
for k in range(1, n+1):
  for a in range(1, n+1):
    for b in range(1, n+1):
      graph[a][b] = min(graph[a][b], graph[a][k]+graph[k][b])

# ์ˆ˜ํ–‰๋œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅ
for a in range(1, n+1):
  for b in range(1, n+1):
    # ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œ์ด๋ผ๊ณ  ์ถœ๋ ฅ
    if graph[a][b] == INF :
      print("X", end =" ")
    else: # ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
      print(graph[a][b], end=" ")
  print() # ์ค„๋ฐ”๊ฟˆ

๐Ÿ’ก ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์˜ˆ์‹œ

Q1. ๋ฏธ๋ž˜๋„์‹œ

  ๋ฏธ๋ž˜๋„์‹œ์—๋Š” 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€์˜ ํšŒ์‚ฌ๊ฐ€ ์žˆ๋Š”๋ฐ ํŠน์ • ํšŒ์‚ฌ๋ผ๋ฆฌ๋Š” ์„œ๋กœ ๋„๋กœ๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋‹ค. ๋ฐฉ๋ฌธ ํŒ๋งค์› A๋Š” ํ˜„์žฌ 1๋ฒˆ ํšŒ์‚ฌ์— ์œ„์น˜ํ•ด์žˆ์œผ๋ฉด X๋ฒˆํšŒ์‚ฌ์— ๋ฐฉ๋ฌธํ•ด ๋ฌผ๊ฑด์„ ํŒ๋งคํ•˜๊ณ ์ž ํ•œ๋‹ค. ๋ฏธ๋ž˜๋„์‹œ์—์„œ ํŠน์ •ํšŒ์‚ฌ์— ๋„์ฐฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์€ ํšŒ์‚ฌ๋ผ๋ฆฌ ์—ฐ๊ฒฐ๋œ ๋„๋กœ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์œ ์ผํ•˜๋‹ค. ๋˜ํ•œ ์—ฐ๊ฒฐ๋œ 2๊ฐœ์˜ ํšŒ์‚ฌ๋Š” ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฏธ๋ž˜ ๋„์‹œ์—์„œ์˜ ๋„๋กœ๋Š” ๋งˆํ•˜์˜ ์†๋„๋กœ ์‚ฌ๋žŒ์„ ์ด๋™์‹œ์ผœ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ •ํšŒ์‚ฌ์™€ ๋‹ค๋ฅธ ํšŒ์‚ฌ๊ฐ€ ๋„๋กœ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋‹ค๋ฉด ์ •ํ™•ํžˆ 1๋งŒํผ์˜ ์‹œ๊ฐ„์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

  ๋˜ํ•œ ์˜ค๋Š˜ ๋ฐฉ๋ฌธํŒ๋งค์›์€ ๊ธฐ๋Œ€ํ•˜๋˜ ์†Œ๊ฐœํŒ…์—๋„ ์ฐธ์„ํ•˜๊ณ ์žํ•œ๋‹ค. ์†Œ๊ฐœํŒ… ์ƒ๋Œ€๋Š” K๋ฒˆ ํšŒ์‚ฌ์— ์กด์žฌํ•œ๋‹ค. ๋ฐฉ๋ฌธ ํŒ๋งค์› A๋Š” X๋ฒˆํšŒ์‚ฌ์— ๊ฐ€์„œ ๋ฌผ๊ฑด์„ ํŒ๋งคํ•˜๊ธฐ ์ „์— ๋จผ์ € ์†Œ๊ฐœํŒ… ์ƒ๋Œ€์˜ ํšŒ์‚ฌ์— ์ฐพ์•„๊ฐ€์„œ ํ•จ๊ป˜ ์ปคํ”ผ๋ฅผ ๋งˆ์‹ค ์˜ˆ์ •์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐฉ๋ฌธ ํŒ๋งค์› A๋Š” 1๋ฒˆํšŒ์‚ฌ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ K๋ฒˆ ํšŒ์‚ฌ๋ฅผ ๋ฐฉ๋ฌธํ•œ ๋’ค์— X๋ฒˆ ํšŒ์‚ฌ๋กœ ๊ฐ€๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ๋‹ค. ์ด๋•Œ ๋ฐฉ๋ฌธํŒ๋งค์› A๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ์ด๋™ํ•˜๊ณ  ์‹ถ๋‹ค.๋ฐฉ๋ฌธ ํŒ๋งค์›์ด ํšŒ์‚ฌ ์‚ฌ์ด๋ฅผ ์ด๋™ํ•˜๊ฒŒ ๋˜๋Š” ์ตœ์†Œ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜๋Š ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค, ์ด๋•Œ ์†Œ๊ฐœํŒ…์˜ ์ƒ๋Œ€๋ฐฉ๊ณผ ์ปคํ”ผ๋ฅผ ๋งˆ์‹œ๋Š” ์‹œ๊ฐ„์€ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

 

*์ž…๋ ฅ์กฐ๊ฑด

- ์ฒซ์งธ์ค„์— ์ „์ฒด ํšŒ์‚ฌ์˜ ๊ฐœ์ˆ˜ N๊ณผ ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜ M์ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฐจ๋ก€๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค.(1<=N,M<=100)

- ๋‘๋ฒˆ์งธ์ค„๋ถ€ํ„ฐ M+1๋ฒˆ์งธ ์ค„์—๋Š” ์—ฐ๊ฒฐ๋œ ๋‘ํšŒ์‚ฌ์˜ ๋ฒˆํ˜ธ๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค.

- M+2๋ฒˆ์งธ์ค„์—๋Š” X์™€ K๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฐจ๋ก€๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค.(1<=K<=100)

*์ถœ๋ ฅ์กฐ๊ฑด

- ์ฒซ๋ฒˆ์งธ ์ค„์— ๋ฐฉ๋ฌธ ํŒ๋งค์› A๊ฐ€ K๋ฒˆ ํšŒ์‚ฌ๋ฅผ ๊ฑฐ์ณ X๋ฒˆ ํšŒ์‚ฌ๋กœ ๊ฐ€๋Š” ์ตœ์†Œ ์ด๋™ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.

- ๋งŒ์•ฝ X์— ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

์ž…๋ ฅ ์˜ˆ์‹œ ์ถœ๋ ฅ ์˜ˆ์‹œ
5 7
1 2
1 3
1 4
2 4
3 4
3 5
4 5
4 5
3
4 2
1 3
2 4
3 4
-1

 

[๋ฌธ์ œ ์•„์ด๋””์–ด]

์ „์ฒด ํšŒ์‚ฌ์˜ ๊ฐœ์ˆ˜์™€ ๊ฒฝ๋กœ์˜ ๊ฒฝ์ˆ˜๊ฐ€ 100๊ฐœ ์ดํ•˜๋กœ ํฌ์ง€ ์•Š๋‹ค. 1๋ฒˆ์—์„œ K๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ์™€ K์—์„œ X๋กœ ์ด๋™ํ•˜๋Š” ๋‘๊ฐ€์ง€์˜ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Š” ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ–ˆ์„๋•Œ ํšจ๊ณผ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

[์ฝ”๋“œ]

INF = int(1e9) # ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต ์„ค์ •

# ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜, ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
n, m = map(int, input().split())

# ์ตœ๋‹จ๊ฒฝ๋กœ ๋ฆฌ์ŠคํŠธ
# ๋…ธ๋“œ๋ฒˆํ˜ธ๊ฐ€ 1๋ฒˆ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ(n+1)๋กœ ์„ค์ •
graph = [[INF]*(n+1) for _ in range(n+1)]

# ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
for a in range(1, n+1):
  for b in range(1,n+1):
    if a==b:
      graph[a][b] = 0

# ๋…ธ๋“œ์˜ ์—ฐ๊ฒฐ ์ •๋ณด
for _ in range(m):
  # A์—์„œ B๋กœ ๊ฐ€๋Š” ๋น„์šฉ์€ 1๋กœ ๋™์ผ. ์–‘๋ฐฉํ–ฅ์ด๋‹ค.
  a,b = map(int, input().split())
  graph[a][b] = 1
  graph[b][a] = 1

# ๊ฑฐ์ณ๊ฐˆ ๋…ธ๋“œ k์™€ ์ตœ์ข… ๋ชฉ์ ์ง€ x
x, k = map(int, input().split())

# ์ ํ™”์‹์— ๋”ฐ๋ผ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰
for k in range(1, n+1):
  for a in range(1, n+1):
    for b in range(1, n+1):
      graph[a][b] = min(graph[a][b], graph[a][k]+graph[k][b])

# ์ˆ˜ํ–‰๋œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅ
result = graph[1][k]+graph[k][x]

#๋„๋‹ฌ ๋ถˆ๊ฐ€๋Šฅ
if result >= INF :
  print("-1")
else: # ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
  print(result, end=" ")