Vous organisez une ligue de basket-ball 1 contre 1 avec un calendrier des matchs. À la fin de la ligue, chaque joueur doit déclarer son supposé record de victoires-défaites (il n'y a pas d'égalité), mais vous voulez vérifier si le classement proposé était réellement possible compte tenu du calendrier.
Par exemple: vous avez quatre joueurs (Alice + Bob + Carol + Dave) et votre programme est un simple tournoi à la ronde. Les classements déclarés [ A: 3-0 B: 1-2 C: 1-2 D: 1-2] et [ A: 2-1 B: 1-2 C: 1-2 D: 2-1] seraient possible, mais la position debout [ A: 3-0 B: 0-3 C: 0-3 D: 3-0] ne le serait pas.
Supposons maintenant que le calendrier soit plutôt un match de 3 matchs entre Alice + Bob et Carol + Dave. La position déclarée [ A: 3-0 B: 0-3 C: 0-3 D: 3-0] est maintenant possible, mais [ A: 3-0 B: 1-2 C: 1-2 D: 1- 2] ne le serait plus.
(L'horaire n'a pas besoin d'être symétrique de quelque manière que ce soit. Vous pourriez faire en sorte qu'Alice ne joue contre Bob que 10 fois, puis que Bob + Carol + Dave jouent 58 round robins les uns contre les autres.)
Problème : Étant donné un calendrier avec k participants et n matchs totaux, vérifiez efficacement si un classement gagnant-perdant proposé pourrait réellement se produire à partir de ce calendrier.
Le O (), la méthode de la force brute est évidente, énumère tous les résultats possibles du jeu et vérifie s'ils correspondent au classement proposé. Et si k est petit, l'augmentation n n'ajoute pas beaucoup de complexité - il est très facile de vérifier le classement d'une ligue à deux, qu'ils jouent dix matchs ou dix milliards de matchs. Au-delà de cela, je n'ai pas beaucoup progressé dans la recherche d'une meilleure méthode et j'étais curieux de savoir si quelqu'un avait déjà vu un problème similaire auparavant.
la source