import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static final int INF = 101;
static int N, M, result;
static int[][] dist;
static int[] rowCnt, colCnt;
public static void main(String[] args) throws IOException {
init();
process();
print();
}
private static void init() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
rowCnt = new int[N+1];
colCnt = new int[N+1];
dist = new int[N+1][N+1];
for (int[] row : dist) {
Arrays.fill(row, INF);
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
dist[a][b] = 1; // 큰 구슬 표시
}
}
private static void process() {
floyd();
count();
getResult();
}
private static void floyd() {
for (int k = 1; k <= N; k++) {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (i == j) continue;
dist[i][j] = Math.min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
}
private static void count() {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (i == j || dist[i][j] == INF) continue;
rowCnt[i]++;
colCnt[j]++;
}
}
}
private static void getResult() {
int half = (N+1) / 2;
for (int i = 1; i <= N; i++) {
if (rowCnt[i] >= half) result++;
if (colCnt[i] >= half) result++;
}
}
private static void print() {
System.out.println(result);
}
}
DFS 로도 풀 수 있는 문제라고함, 플로이드 워셜로 해결하였음
플로이드 워셜 알고리즘 수행을 위해 입력 시 큰구슬을 1로 초기화하고, 이외의 지점은 전부 INF
로 초기화
플로이드 워셜 알고리즘을 수행하여 최단 경로 테이블을 갱신
최단 경로 테이블은 i -> j
로의 거리를 나타냄. 이 문제에서 거리는 사실상 의미가 없고, 자기 자신이 아니고, 거리가 INF
가 아니라면(이후 갈수 있다면) 자신보다 무게가 작은 지점
최단 경로 테이블의 갱신 이후 모습
행 순서대로 확인할 경우, 자신보다 작은 값의 개수를 알 수 있음
열 순서대로 확인할 경우, 자신보다 큰 값의 개수를 알 수 있음
그러므로 최단 경로 테이블의 열과 행을 순회하면서 갈 수 있으면, 해당 인덱스의 rowCnt, colCnt
값을 증가 시킴
rowCnt, colCnt
의 값이 (N+1) / 2
의 값 이상일 경우 해당 인덱스는 중간값이 될 수 없음 -> result
값 증가