알고리즘

[알고리즘] 정확한 순위 - K 대회

j9972 2022. 9. 26. 20:10
728x90

1. 문제

생님은 시험을 본 학생 N명의 성적을 분실하고, 성적을 비교한 결과의 일부만 가지고 있다. 학생 N명의 성적은 모두 다른데 다음은 6명의 학생에 대하여 6번만 성적을 비교한 결과다.

  • 1번 학생 → 5번 학생
  • 3 → 4
  • 4 → 2
  • 4 → 6
  • 5 → 2
  • 5 → 4

A번 학생의 성적이 B번 학생보다 낮다면 화살표가 A에서 B를 가리키도록 한다.
위에 제시된 정보를 유추해서 순위를 정확히 알 수 있는 학생도 있고, 알 수 없는 학생도 있다. 정리하면 4번 학생보다 성적이 낮은 학생은 3명이고, 성적이 높은 학생은 2명이므로 4번 학생의 성적 순위를 정확히 알 수 있지만 다른 학생은 정확한 순위를 알 수 없다.
학생들의 성적을 비교한 결과가 주어질 때, 성적 순위를 정확히 알 수 있는 학생은 몇명인지 계산하는 프로그램을 구하시오.

입력조건 

  • 첫째 줄에 학생들의 수 N(2 ≤ N ≤ 500)과 두 학생의 성적을 비교한 횟수 M(2 ≤ M ≤ 10,000)
  • 다음 M개의 각 줄에는 두 학생의 성적을 비교한 결과를 나타내는 두 양의 정수 A와 B

 

2. 접근

1. 두 학생간에 서로서로 비교를 해야하므로 플로이드로 접근

 

 

3. 풀이

# 정확한 순위는 학생 a,b를 서로서로 비교를 하는 성적 비교이기에 플로이드이다
import sys
input = sys.stdin.readline

n, m = map(int, input().split())

INF = int(1e9)

graph = [[INF] * (n+1) for _ in range(n+1)]

for i in range(m):
    a, b = map(int, input().split())
    graph[a][b] = 1

for a in range(1, n+1):
    for b in range(1, n+1):
        if a == b:
            graph[a][b] = 1

for k in range(1, n+1):
    for a in range(1, n+1):
        for b in range(1, n+1):
            graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])

res = 0
for i in range(1, n+1):
    count = 0
    for j in range(1, n+1):
        if graph[i][j] != INF and graph[j][i] != INF:
            count += 1
    if count == n:
        res += 1
print(res)