
오징어게임 시즌 3 빨리 보고 싶습니다... 풀리면 숙소동에서 정주행할 예정입니다.


True/False로 확인하면 됩니다. k에 대해 노드 i -> k로 향하는 경로와, 노드 k -> j로 향하는 경로가 모두 존재하면i -> j로도 이동할 수 있다고 간주합니다.4번에서 1번으로 향하는 경로가 있는지 확인할 때4->2 방향의 경로가 있고, 2->1 방향의 경로가 있으니4->1 역시 경로가 존재한다고 볼 수 있습니다.import sys
N, M = map(int, input().split())
input = sys.stdin.readline
# 인접 행렬 표현
# i행 j열 -> 노드 i에서 j로 가는 경로가 존재하는지 True, False로 저장
graph = [[False] * (N + 1) for _ in range(N + 1)]
# 거리 비교 정보를 통해 간선 표시
for _ in range(M):
heavy, light = map(int, input().split())
graph[heavy][light] = True
# 플로이드 워셜: 경로가 존재할 시 갱신 (i->k 경로, k->j 경로가 모두 존재할 때)
for k in range(1, N + 1):
for i in range(1, N + 1):
for j in range(1, N + 1):
if not graph[i][j]: # 이미 경로가 존재할 시 확인할 필요 없음
graph[i][j] = graph[i][k] and graph[k][j]
i행 j열에 노드 i -> j로 이동 가능한지를 True, False로 표시한 행렬을 구할 수 있습니다.
i행의 True 개수는, 노드 i로부터 도달할 수 있는 노드의 개수입니다.i보다 가벼운 구슬이 몇 개인지를 뜻합니다.j열의 True 개수는, 노드 j에 도달할 수 있는 노드의 개수입니다.j보다 무거운 구슬이 몇 개인지를 뜻합니다.보다 무거운 구슬이 몇 개인지를 뜻합니다.answer = 0
for i in range(1, N + 1):
# 더 가벼운 게 몇 개?
row_check = sum(graph[i][j] for j in range(1, N + 1))
# 더 무거운 게 몇 개?
col_check = sum(graph[j][i] for j in range(1, N + 1))
if row_check >= (N + 1) // 2 or col_check >= (N + 1) // 2:
answer += 1
print(answer)
import sys
N, M = map(int, input().split())
input = sys.stdin.readline
# 인접 행렬 표현
# i행 j열 -> 노드 i에서 j로 가는 경로가 존재하는지 True, False로 저장
graph = [[False] * (N + 1) for _ in range(N + 1)]
# 거리 비교 정보를 통해 간선 표시
for _ in range(M):
heavy, light = map(int, input().split())
graph[heavy][light] = True
# 플로이드 워셜: 경로가 존재할 시 갱신 (i->k 경로, k->j 경로가 모두 존재할 때)
for k in range(1, N + 1):
for i in range(1, N + 1):
for j in range(1, N + 1):
if not graph[i][j]: # 이미 경로가 존재할 시 확인할 필요 없음
graph[i][j] = graph[i][k] and graph[k][j]
answer = 0
for i in range(1, N + 1):
# 더 가벼운 게 몇 개?
row_check = sum(graph[i][j] for j in range(1, N + 1))
# 더 무거운 게 몇 개?
col_check = sum(graph[j][i] for j in range(1, N + 1))
if row_check >= (N + 1) // 2 or col_check >= (N + 1) // 2:
answer += 1
print(answer)