プログラマランキング


質問する


https://programmers.co.kr/learn/courses/30/lessons/49191

コード#コード#

#include <string>
#include <vector>

using namespace std;

int solution(int n, vector<vector<int>> results) {
    int answer = 0;
    vector<vector<int>> graph(n , vector<int>(n ,4));
    for (int i = 0; i < n; i++)
        graph[i][i] = 0;

    for (auto i : results){
        graph[i[0]-1][i[1]-1] = 1;
        graph[i[1]-1][i[0]-1] = -1;
    }

    for (int k = 0; k < n; k++){
        for (int i = 0; i < n; i++){
            for (int j = 0; j < n; j++) {
                if (graph[i][j] == 4 && graph[i][k] + graph[k][j] == 2){      
                    graph[i][j] = 1;
                    graph[j][i] = -1;
                }
            }
        }
    }

    for (int i = 0; i < n; i++){
        bool t = true;
        for (int j = 0; j < n; j++){
            if (graph[i][j] == 4){
                t = false;
                break;
            }
        }
        if (t)
            answer++;
    }
    
    return answer;
}

に答える


ボクシングの試合にはn人のボクサーが参加し、それぞれ1番からn番まで参加した.ボクシングの試合は1対1で行われ、A選手の実力がB選手より優れていれば、A選手はいつもB選手に勝つ.審判は与えられた試合の結果に基づいて選手をランキングしたいと思っている.しかし、いくつかの試合結果を失ったため、正確な順位はつけられなかった.
これは問題です.私は勝った1、負けた-1をグラフに置いて、floydwalshアルゴリズムを使って、すべての選手の間の結果をグラフに保存します.
if (graph[i][j] == 4 && graph[i][k] + graph[k][j] == 2){      
                    graph[i][j] = 1;
                    graph[j][i] = -1;
                }
ここで、図[i][j]=4の場合、i選手とj選手の順位はまだ確定していないが、k選手を経てi選手がk選手に勝ってk選手がj選手に勝っていれば、i選手がj選手に勝ってしまうので、上記のコードに従って保存する.