모양은 같으나, 무게가 모두 다른 N개의 구슬이 있다. N은 홀수이며, 구슬에는 번호가 1,2,...,N으로 붙어 있다. 이 구슬 중에서 무게가 전체의 중간인 (무게 순서로 (N+1)/2번째) 구슬을 찾기 위해서 아래와 같은 일을 하려 한다.
우리에게 주어진 것은 양팔 저울이다. 한 쌍의 구슬을 골라서 양팔 저울의 양쪽에 하나씩 올려 보면 어느 쪽이 무거운가를 알 수 있다. 이렇게 M개의 쌍을 골라서 각각 양팔 저울에 올려서 어느 것이 무거운가를 모두 알아냈다. 이 결과를 이용하여 무게가 중간이 될 가능성이 전혀 없는 구슬들은 먼저 제외한다.
예를 들어, N=5이고, M=4 쌍의 구슬에 대해서 어느 쪽이 무거운가를 알아낸 결과가 아래에 있다.
위와 같이 네 개의 결과만을 알고 있으면, 무게가 중간인 구슬을 정확하게 찾을 수는 없지만, 1번 구슬과 4번 구슬은 무게가 중간인 구슬이 절대 될 수 없다는 것은 확실히 알 수 있다. 1번 구슬보다 무거운 것이 2, 4, 5번 구슬이고, 4번 보다 가벼운 것이 1, 2, 3번이다. 따라서 답은 2개이다.
M 개의 쌍에 대한 결과를 보고 무게가 중간인 구슬이 될 수 없는 구슬의 개수를 구하는 프로그램을 작성하시오.
# 2617
import sys
input = lambda : sys.stdin.readline().strip()
INF = int(1e9)
n, m = map(int, input().split())
graph_down = [[INF] * (n+1) for _ in range(n+1)]
graph_up = [[INF] * (n+1) for _ in range(n+1)]
for _ in range(m):
a, b = map(int, input().split())
graph_down[a][b] = 1
graph_up[b][a] = 1
for k in range(1, n+1):
for a in range(1, n+1):
for b in range(1, n+1):
graph_down[a][b] = min(graph_down[a][b], graph_down[a][k] + graph_down[k][b])
graph_up[a][b] = min(graph_up[a][b], graph_up[a][k] + graph_up[k][b])
count = 0
for i in range(1, n+1):
d, u = 0, 0
for j in range(1, n+1):
if graph_down[i][j] != INF:
d += 1
if graph_up[i][j] != INF:
u += 1
if max(d, u) >= (n+1) // 2:
count += 1
print(count)