PTA7-2 胜利者集合

编号为 1 到 n 的 n 名玩家将参加循环赛。 具体来说,对于每一对 (i,j) (1≤i<j≤N),玩家 i 和玩家 j 比赛一次,总共 2N(N−1)​次比赛。 在每场比赛中,一名玩家赢下比赛,另一名玩家将输掉比赛,没有平局。 现在 m 场比赛已经结束。在第 i 场比赛中,玩家 wi​ 赢得玩家 li​. 请找出所有场次结束后可能成为胜利者的所有玩家。如果该玩家的获胜次数严格大于任何其他玩家的获胜次数,则称该玩家为胜利者。(注:未进行的比赛胜负不确定)
2≤ n ≤50
0≤ m ≤2n(n−1)​
1≤wi​, li​≤n
wi​ = li​
if i != j, then(wi​,li​)!=(wj​,lj​).
(wi​,li​)!=(lj​,wj​)
输入格式:

n m
w[1] l[1]
w[2] l[2]
...
w[m] l[m]

输出格式:
升序输出可能胜利者的集合,若无胜利者,则无需输出。
行末无空格

输入样例:
4 2
2 1
2 3

输出样例:
2 4

一下为我的代码

#include<iostream>
using namespace std;
int main(){
    int n,m,w,l;
    cin>>n>>m;
    int W[n+1]={0},f[n+1],flag;
    for(int i=1;i<n+1;i++){
        W[i]=n-1;
        f[i]=0;
    }
    for(int i=1;i<m+1;i++){
        cin>>w>>l;
        W[l]--;
    }
    int max=0;
    for(int i=1;i<n+1;i++){
        if(max<W[i])max=W[i];
    }
    for(int i=1;i<n+1;i++){
        if(max==W[i]){
            f[i]=1;
            flag=i;
        }
    }
        for(int i=1;i<n+1;i++){
        if(f[i]==1){
            cout<< i;
           if(i!=flag)cout<<" ";
      }
 }
    return 0;
}

在PTA上的25个测试点有10个正确,15个错误
希望得到改进方案,和知道疏忽的情况


#include <iostream>
#include <unordered_map>
#include <vector>

using namespace std;

int main()
{
    int n, m;
    cin >> n >> m;

    unordered_map<int, int> scores;
    while (m -- )
    {
        int w, l;
        cin >> w >> l;
        scores[w] ++;
        scores[l] --;
    }

    vector<int> res;
    int max_score = -1;
    for (auto& [k, v] : scores)
    {
        if (v > max_score)
        {
            max_score = v;
            res.clear();
            res.push_back(k);
        }
        else if (v == max_score)
        {
            res.push_back(k);
        }
    }

    for (int x : res) cout << x << " ";

    return 0;
}