ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [알고리즘] 정확한 순위 - K 대회
    알고리즘 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)
Designed by Tistory.