Memeriksa apakah kedudukan menang-kalah dari suatu liga dimungkinkan

8

Anda menjamu liga basket 1 v 1 dengan jadwal pertandingan. Di akhir liga, Anda meminta setiap pemain untuk melaporkan rekor menang-kalah (tidak ada ikatan), tetapi Anda ingin memeriksa apakah kedudukan yang diusulkan benar-benar dimungkinkan berdasarkan jadwal.

Misalnya: Anda memiliki empat pemain (Alice + Bob + Carol + Dave) dan jadwal Anda adalah round robin sederhana. Klasemen yang dilaporkan [ A: 3-0 B: 1-2 C: 1-2 D: 1-2] dan [ A: 2-1 B: 1-2 C: 1-2 D: 2-1] adalah mungkin, tetapi kedudukan [ A: 3-0 B: 0-3 C: 0-3 D: 3-0] tidak akan terjadi.

Sekarang anggaplah jadwalnya adalah pertandingan 3 head to head antara Alice + Bob dan Carol + Dave. Posisi yang dilaporkan [ A: 3-0 B: 0-3 C: 0-3 D: 3-0] sekarang dimungkinkan, tetapi [ A: 3-0 B: 1-2 C: 1-2 D: 1- 2] tidak akan lagi.

(Jadwal tidak perlu simetris dengan cara apa pun. Anda bisa membuat Alice hanya bermain melawan Bob 10 kali, lalu membuat Bob + Carol + Dave bermain 58 round robins satu sama lain.)

Soal : Mengingat jadwal dengan k peserta dan n jumlah game, efisien memeriksa apakah klasemen menang-kalah yang diusulkan benar-benar bisa terjadi dari jadwal itu.


Metode brute force O ( ) jelas, menyebutkan semua kemungkinan hasil pertandingan dan melihat apakah ada yang cocok dengan kedudukan yang diajukan. Dan jika k bertambah kecil dan tidak menambah kerumitan - sangat mudah untuk memeriksa kedudukan liga dua orang terlepas dari apakah mereka bermain sepuluh pertandingan atau sepuluh miliar pertandingan. Selain itu saya belum membuat banyak kemajuan dalam menemukan metode yang lebih baik, dan ingin tahu apakah ada yang melihat masalah yang sama sebelumnya.2n

ManyCookies
sumber

Jawaban:

8

Ini dapat dimodelkan sebagai masalah Max-Flow.

Sebagai langkah preprocessing, pastikan bahwa jumlah game sama dengan jumlah dari jumlah kemenangan (jika tidak, Anda tahu ada sesuatu yang salah).

Biarkan menjadi satu set simpul yang terkait dengan permainan yang dimainkan, dan satu set simpul yang sesuai dengan para pemain. Misalkan dan menunjukkan dua simpul tambahan (sumber dan wastafel).GPst

Sekarang untuk setiap permainan dimainkan antara dan , tambahkan tepi dari ke dengan kapasitas dan tepi dari ke dan ke juga dengan kapasitas . Ini memodelkan fakta bahwa permainan dapat memberikan satu poin untuk salah satu pemain.gGp1Pp2Psg1gp1gp21

Kemudian untuk setiap pemain tambahkan keunggulan dari ke dengan kapasitas sama dengan jumlah kemenangan yang dilaporkan untuk pemain . Ini memodelkan fakta bahwa pemain ini harus menang paling banyak dalam jumlah pertandingan ini.pPptp

Sangat mudah untuk melihat dari sini bahwa jika skor yang dilaporkan adalah mungkin, akan ada aliran jenuh dari ke dan secara timbal balik. Jadi yang perlu Anda periksa adalah apakah maksimum -flow dalam grafik ini sama dengan jumlah game yang dimainkan.sts,t

Sebagai alternatif, Anda juga bisa memiliki grafik dengan satu titik per permainan dan sejumlah simpul untuk setiap pemain yang sesuai dengan jumlah kemenangan, sambungkan dengan cara yang sama seperti sebelumnya, dan lihat apakah jumlah tepi dalam pencocokan maksimum sama dengan jumlah gim (tapi ini hampir sama saja kok).

Tassle
sumber
Sangat bagus! Dan alih-alih memiliki simpul untuk masing- masing permainan terpisah m antara P1 dan P2, dapatkah Anda menggabungkan semuanya menjadi satu simpul (simpul "seri") dengan kapasitas tepi m bukannya 1?
ManyCookies
Dalam preprocessing, Anda juga harus memeriksa bahwa jumlah menang + kalah yang dilaporkan oleh setiap pemain sama dengan jumlah total game yang dimainkan pemain.
Ilmari Karonen
Selain itu, sementara jawaban Anda tampaknya benar secara teknis, perhatikan bahwa dalam latihan memecahkan masalah aliran-max tidak perlu untuk menangkap kecurangan sederhana (di mana pemain hanya menipu dengan mengklaim kemenangan ekstra dan / atau lebih sedikit kerugian; preprocessing sendiri yang akan menangkap itu) juga tidak cukup untuk mendapatkan kecurangan yang lebih halus (misalnya Alice kalah dalam pertandingan dengan Bob, tetapi mereka berdua sepakat untuk melaporkannya sebagai kemenangan Alice; tidak ada cara untuk mendeteksi bahwa hanya menggunakan data yang diberikan). Tapi itu masalah dengan masalah @ ManyCookies seperti yang dinyatakan, bukan dengan solusi Anda.
Ilmari Karonen
@ManyCookies: Tentu, itu juga harus bekerja :)
Tassle
@IlmariKaronen: Ya, Anda dapat menambahkan sejumlah langkah preprocessing yang Anda inginkan untuk membuat segalanya berjalan lebih cepat dalam praktiknya tetapi ini tidak sepenuhnya diperlukan, sedangkan langkah preprocessing yang saya usulkan utamanya adalah untuk membuat pengecekan kondisi max-flow lebih mudah (tanpa itu Anda perlu memeriksa apakah alirannya jenuh di kedua ujungnya, yang akan mendidih hingga langkah preprocessing).
Tassle