import sys
input = sys.stdin.readline
N = int(input())
M = int(input())
graph = [[0 for _ in range(N+1)] for i in range(N+1)]
visited = [[True for _ in range(N+1)] for _ in range(N+1)]
for _ in range(M):
x,y = map(int,input().split())
graph[x][y] = 1
for mid in range(1,N+1):
for start in range(1,N+1):
for end in range(1,N+1):
if start == end:
continue
if graph[start][mid] and graph[mid][end]:
graph[start][end] = 1
result = []
for start in range(1,N+1):
cnt = 0
for end in range(1,N+1):
if start == end:
continue
else:
if not (graph[start][end] or graph[end][start]):
cnt += 1
result.append(cnt)
for row in result:
sys.stdout.write(str(row)+'\n')
많이 해맸던 문제였다. 대소관계가 있는데 그걸 통해, 서로 비교가 불가능한 경우를 찾는 것을 어떻게 할지 고민을 많이했다.
플로이드 와샬을 통해 만들었다.
대소 관계가 가능하다는 것은
(1,2) (2,3) 이렇게 주어진다하면
그래프에서 graph[1][2],graph[2][3]에 1이 들어갈것이다.
그러면 플로이드 와샬을 통해, 두개의 그래프가 graph[start][mid], graph[mid][end] 가 전부 1이라고 했을때에만
start 가 end보다 크다는것을 알 수 있다.
이렇게 플로이드 와샬을 돌리고 난뒤에, 전체 N에 대해서 N번 돌려주면서, 서로 다른 두점의 그래프의 값이 전부 0이면,
대소비교가 불가능한 경우이다. 이 경우를 전부 세어주면 문제를 풀 수 있다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 21772 가희와 고구마 먹방 (0) | 2021.05.27 |
---|---|
[BOJ/백준] 21771 가희야 거기서 자는거 아니야 (0) | 2021.05.27 |
[BOJ/백준] 1644 소수의 연속합 (0) | 2021.05.27 |
[BOJ/백준] 2268 수들의 합 (0) | 2021.05.27 |
[BOJ/백준] 1368 물대기 (0) | 2021.05.23 |