Verifica se sono possibili le classifiche delle sconfitte di una lega


8

Stai ospitando un campionato di basket 1 v 1 con un programma di gioco. Alla fine del campionato, ogni giocatore deve riportare il suo presunto record di sconfitte (non ci sono legami), ma si desidera verificare se le classifiche proposte fossero effettivamente possibili dato il programma.

Ad esempio: hai quattro giocatori (Alice + Bob + Carol + Dave) e il tuo programma è un semplice round robin. Le classifiche riportate [ A: 3-0 B: 1-2 C: 1-2 D: 1-2] e [ A: 2-1 B: 1-2 C: 1-2 D: 2-1] sarebbero possibile, ma la posizione [ A: 3-0 B: 0-3 C: 0-3 D: 3-0] non sarebbe.

Supponiamo ora che il programma sia invece un gioco testa a testa tra Alice + Bob e Carol + Dave. La posizione dichiarata [ A: 3-0 B: 0-3 C: 0-3 D: 3-0] è ora possibile, ma [ A: 3-0 B: 1-2 C: 1-2 D: 1- 2] non sarebbe più.

(Il programma non deve essere simmetrico in alcun modo. Puoi far giocare Alice solo contro Bob 10 volte, quindi fai in modo che Bob + Carol + Dave giochino 58 round robin uno contro l'altro.)

Problema : dato un programma con k partecipanti e n partite totali, controlla in modo efficace se una classifica di sconfitte proposta potrebbe effettivamente verificarsi da quel programma.


Il metodo O ( ) della forza bruta è ovvio, enumera tutti i possibili risultati del gioco e vedi se ce n'è uno corrispondente alla classifica proposta. E se k è piccolo aumentando n non aggiunge molta complessità: è molto facile controllare la classifica di una lega per due persone indipendentemente dal fatto che giochino dieci partite o dieci miliardi di partite. Oltre a ciò, non ho fatto molti progressi nel trovare un metodo migliore ed ero curioso di sapere se qualcuno avesse mai visto un problema simile in precedenza.2n

Risposte:


8

Questo può essere modellato come un problema di flusso massimo.

Come fase di preelaborazione, assicurati che il numero di partite sia uguale alla somma del numero di vittorie (in caso contrario, sai che qualcosa non va).

Sia un insieme di vertici corrispondenti alle partite giocate e un insieme di vertici corrispondente ai giocatori. Let e denotano due vertici addizionali (fonte e lavandino).GPst

Ora per ogni gioco giocato tra e , aggiungi un bordo da a con capacità e bordi da a e da a anche con capacità . Ciò modella il fatto che il gioco può dare un punto a entrambi i giocatori.gGp1Pp2Psg1gp1gp21

Quindi per ogni giocatore aggiungi un vantaggio da a con capacità pari al numero riportato di vittorie per il giocatore . Ciò modella il fatto che questo giocatore dovrebbe vincere al massimo questo numero di partite.pPptp

È facile vedere da qui che se i punteggi riportati sono possibili, ci sarà un flusso di saturazione da a e reciprocamente. Quindi tutto ciò che devi controllare è se il massimo -flow in questo grafico è uguale al numero di partite giocate.sts,t

In alternativa, potresti anche avere un grafico con un vertice per partita e un numero di vertici per ciascun giocatore corrispondente al numero di vittorie, collegarli allo stesso modo di prima e vedere se il numero di bordi in una corrispondenza massima è uguale a il numero di giochi (ma questa è quasi la stessa cosa in realtà).


Molto bella! E piuttosto che avere un nodo per ciascuno dei m giochi separati tra P1 e P2, potresti consolidarli tutti in un nodo (un nodo "serie") con capacità di bordo m invece di 1?
ManyCookies

Nella pre-elaborazione, dovresti anche verificare che il numero di vittorie + perdite riportate da ciascun giocatore sia uguale al numero totale di partite giocate da quel giocatore.
Ilmari Karonen,

Inoltre, sebbene la tua risposta sembri tecnicamente corretta, nota che nella pratica la soluzione del problema del flusso massimo non è necessaria per imbrogliare in modo semplice (in cui i giocatori imbrogliano sostenendo vincite extra e / o meno perdite; solo la pre-elaborazione lo capirà) né sufficiente per imbrogliare in modo più sottile (dove ad esempio Alice perde una corrispondenza con Bob, ma entrambi concordano successivamente di segnalarlo come vittoria di Alice; non c'è modo di rilevarlo usando solo i dati forniti). Ma questo è un problema con il problema di @ ManyCookies come indicato, non con la tua soluzione.
Ilmari Karonen,

@ManyCookies: Certo, dovrebbe funzionare anche :)
Tassle,

@IlmariKaronen: Sì, puoi aggiungere qualsiasi numero di passaggi di preelaborazione che desideri per rendere le cose più veloci in pratica, ma questi non sono strettamente necessari, mentre il passaggio di preelaborazione che ho proposto era principalmente quello di rendere più facile il controllo della condizione di flusso massimo (senza di essa dovresti verificare che il flusso si saturi ad entrambe le estremità, il che si ridurrebbe a quella fase di preelaborazione).
Tassle,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.