๐ก ์กฐ๊ฑด ๋ฐ ํ์ด
1๋ฒ๋ถํฐ N๋ฒ๊น์ง
๋ฒํธ๊ฐ ๋ถ์ฌ์ ธ ์๋ ํ์๋ค๋ผ๋ฆฌ ๋ ๋ช
์ฉ ํค๋ฅผ ๋น๊ตํ๋ค.
N
๋ช
์ ํ์๋ค์ ๋ชจ๋ ํค๊ฐ ๋ค๋ฅด๋ค.
- ํ๋ก์ด๋์์ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด๊ฒฐ์ด ๊ฐ๋ฅํ ๋ฌธ์ ์ด๋ค.
2 <= N <= 500
, 0 <= M <= N(N-1)/2
M
๊ฐ์ ์ค์ ๋ ํ์์ ํค๋ฅผ ๋น๊ตํ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ ๋ ์์ ์ ์ a, b
๊ฐ ์ฃผ์ด์ง๋ค.
a, b == a๊ฐ b๋ณด๋ค ์๋ค
- ์์ ์ ํค๊ฐ ๋ช๋ฒ์งธ์ธ์ง ์ ์ ์๋ ํ์์ ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์
๐ฅ ์์ค ์ฝ๋
from sys import stdin
n, m = map(int, stdin.readline().split())
inf = int(1e9)
graph = [[inf] * (n + 1) for _ in range(n + 1)]
for _ in range(m):
a, b = map(int, stdin.readline().split())
graph[b][a] = 1
for i in range(1, n + 1):
for j in range(1, n + 1):
for k in range(1, n + 1):
if j == k:
graph[j][k] = 0
continue
if graph[j][k] > graph[j][i] + graph[i][k]:
graph[j][k] = graph[j][i] + graph[i][k]
res = n
for i in range(1, n + 1):
checker = 1
for j in range(1, n + 1):
if graph[i][j] == inf and graph[j][i] == inf:
res -= 1
checker = 0
if not checker:
break
print(res)
๐ ์์ ๋ฐ ์คํ๊ฒฐ๊ณผ
์์
6 7
1 3
1 5
3 4
5 4
4 2
4 6
5 2
์คํ๊ฒฐ๊ณผ
2
โจ๏ธ ๋ฌธ์ ํ์ด
- ์ต์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ํด์ค๋ค๊ณ ์๊ฐํ๊ณ
ํ๋ก์ด๋ ์์ฌ
์ ์ฌ์ฉํ๊ธฐ ์ํด 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ณ
INF
๊ฐ์ ๋ฃ์ด ๋ฆฌ์คํธ๋ฅผ ์ด๊ธฐํํ๋ค.
a, b
๊ฐ์ ์
๋ ฅ๋ฐ๊ฒ ๋๋ฉด a ๊ฐ b ๋ณด๋ค ์๋ค
๋ผ๋ ์กฐ๊ฑด์ ๋ฐ๋ผ, 2์ฐจ์ ๋ฆฌ์คํธ์ graph[b].append(a)
ํ๋ก์ด๋ ์์ฌ
์๊ณ ๋ฆฌ์ฆ ์คํ
- ์์ ์ ํค๊ฐ ๋ช๋ฑ์ธ์ง ์ ์์๋ ์ฌ๋์ ์ฒ์๋ถํฐ
N
๋ช
์ด๋ผ๊ณ ์ ์ํ ๋ค 1๋ฒ ํ์๋ถํฐ ์์ฐจ์ ์ผ๋ก
2์ค ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํด ํ๋ก์ด๋ ์์ฌ๋ก ๋ง๋ 2์ฐจ์ ๋ฆฌ์คํธ์ ์ ๊ทผ
if graph[i][j] == inf and graph[j][i] == inf:
i๋ฒ ํ์์ด j๋ฒ ํ์๊ณผ์ ์๋ค, ํฌ๋ค์ ์ ๋ณด๊ฐ ์๋ฌด๊ฒ๋ ์๋ค๋ฉด res -= 1
- 2์ค ๋ฐ๋ณต๋ฌธ์ ๋น ์ ธ๋์ค๊ธฐ ์ํ checker๋ณ์์ 0์ ๋ฃ์ด์ฃผ๊ณ (False) ๋ฐ๋ณต๋ฌธ ํ์ถ
PyPy3
์ ์ถ
๐พ ๋๋์
- ๋ฌธ์ ๋ฅผ ๋ณด์๋ง์
ํ๋ก์ด๋์์ฌ ์๊ณ ๋ฆฌ์ฆ
๊ณผ ์ ๋์จ-ํ์ธ๋
๊ฐ ์๊ฐ๋ฌ๋ค.
์ ๋์จ-ํ์ธ๋
๋ก ๊ตฌํ์ ํ๋ ค๋ค๋ณด๋ ์ ๋ ์๋ ๊ฒ ๊ฐ์ ํ๋ก์ด๋์์ฌ
์ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค.
- ์๋ ๋ถ๋ค์ ์ด์ผ๊ธฐ๋ฅผ ๋ค์ด๋ณด๋
BFS
๋ก ๊ตฌํํ์
จ๋ค๊ณ ํ๋ค.
- ํ๋ก์ด๋ ์์ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด๊ฒฐํ์ ๋,
Python3
๋ก ์๊ฐ์ด๊ณผ๊ฐ ์๊ฒผ์ผ๋ฉฐ, PyPy3
๋ ํต๊ณผ
BFS
๋ก ํ์ดํ๋ ๋ฐฉ๋ฒ๋ ๊ตฌํํด๋ด์ผ๊ฒ ๋ค.
- ๋ฌธ์ ๋ฅผ ํ์๊ฐ์ ์๋๋ฐ ์๊ฐํ ์๊ฐ์ด ๋๋ฌด ๊ธธ๋ค. ์์ง ์๋ฌ์ด ๋์ง ๋ชปํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ณ ๋ ํ์ด๋ด์ผ๊ฒ ๋ค.