Kiểm tra xem bảng xếp hạng thắng thua của một giải đấu có khả thi không


8

Bạn đang tổ chức một giải đấu bóng rổ 1 v 1 với lịch thi đấu. Vào cuối giải đấu, bạn có mỗi người chơi báo cáo kỷ lục thắng thua của họ (không có ràng buộc), nhưng bạn muốn kiểm tra xem các bảng xếp hạng được đề xuất có thực sự có thể được đưa ra theo lịch trình hay không.

Ví dụ: bạn có bốn người chơi (Alice + Bob + Carol + Dave) và lịch trình của bạn là một vòng tròn đơn giản. Bảng xếp hạng được báo cáo [ A: 3-0 B: 1-2 C: 1-2 D: 1-2] và [ A: 2-1 B: 1-2 C: 1-2 D: 2-1] sẽ là có thể, nhưng đứng [ A: 3-0 B: 0-3 C: 0-3 D: 3-0] sẽ không được.

Bây giờ giả sử lịch trình thay vì 3 trò chơi đối đầu giữa Alice + Bob và Carol + Dave. Hiện tại đã có báo cáo [ A: 3-0 B: 0-3 C: 0-3 D: 3-0], nhưng [ A: 3-0 B: 1-2 C: 1-2 D: 1- 2] sẽ không còn nữa.

(Lịch trình không cần phải đối xứng theo bất kỳ cách nào. Bạn có thể cho Alice chỉ chơi với Bob 10 lần, sau đó khiến Bob + Carol + Dave chơi 58 vòng tròn với nhau.)

Vấn đề : Đưa ra một lịch trình với k người tham gia và n tổng số trò chơi, kiểm tra hiệu quả liệu một bảng xếp hạng thắng thua có thể thực sự xảy ra từ lịch trình đó hay không.


Phương pháp vũ phu O ( ) là hiển nhiên, liệt kê tất cả các kết quả trò chơi có thể và xem liệu có phù hợp với bảng xếp hạng đề xuất không. Và nếu k tăng nhỏ, n không tăng thêm độ phức tạp - rất dễ dàng để kiểm tra thứ hạng của hai người bất kể họ chơi mười trận hay mười tỷ trận. Ngoài ra, tôi đã không đi đầu trong việc tìm ra một phương pháp tốt hơn, và tò mò liệu có ai từng thấy một vấn đề tương tự trước đây không.2n

Câu trả lời:


8

Điều này có thể được mô hình hóa như một vấn đề Max-Flow.

Là bước tiền xử lý, hãy đảm bảo rằng số lượng trò chơi bằng tổng số lần thắng (nếu không, bạn biết có gì đó không đúng).

Đặt là một tập hợp các đỉnh tương ứng với các trò chơi đã chơi và là một tập hợp các đỉnh tương ứng với người chơi. Gọi và lần lượt là hai đỉnh bổ sung (nguồn và chìm).GPSt

Bây giờ với mọi trò chơi chơi giữa và , hãy thêm một cạnh từ đến với dung lượng và các cạnh từ đến và đến cũng với dung lượng . Điều này mô hình thực tế rằng trò chơi có thể cho một điểm cho một trong hai người chơi.gGp1Pp2PSg1gp1gp21

Sau đó, với mỗi người chơi thêm một cạnh từ đến với dung lượng bằng với số lần thắng được báo cáo cho người chơi . Điều này mô hình thực tế rằng người chơi này sẽ giành chiến thắng tại hầu hết số lượng trò chơi này.pPptp

Từ đây có thể dễ dàng nhận thấy rằng nếu điểm số được báo cáo là có thể, sẽ có một dòng bão hòa từ đến và đối ứng. Vì vậy, tất cả những gì bạn cần kiểm tra là nếu dòng tối đa trong biểu đồ này bằng với số lượng trò chơi đã chơi.StS,t

Ngoài ra, bạn cũng có thể có một biểu đồ với một đỉnh cho mỗi trò chơi và một số đỉnh cho mỗi người chơi tương ứng với số lần thắng, kết nối chúng theo cùng một cách như trước và xem số cạnh trong kết hợp tối đa có bằng số lượng trò chơi (nhưng điều này gần như giống nhau thực sự).


Rất đẹp! Và thay vì có một nút cho mỗi m trò chơi riêng biệt giữa P1 và P2, bạn có thể hợp nhất tất cả chúng thành một nút (nút "sê-ri") với công suất cạnh m thay vì 1 không?
ManyCookies

Trong quá trình tiền xử lý, bạn cũng nên kiểm tra xem số lần thắng + thua của mỗi người chơi bằng với tổng số trò chơi mà người chơi đã chơi.
Ilmari Karonen

Ngoài ra, trong khi câu trả lời của bạn có vẻ đúng về mặt kỹ thuật, lưu ý rằng trong thực tế giải quyết vấn đề luồng tối đa là không cần thiết để bắt gian lận đơn giản (trong đó người chơi chỉ gian lận bằng cách yêu cầu thắng thêm và / hoặc ít thua hơn; chỉ riêng tiền xử lý sẽ nắm bắt được) để bắt được sự gian lận tinh vi hơn (ví dụ Alice thua trận đấu với Bob, nhưng cả hai sau đó đều đồng ý báo cáo đó là chiến thắng của Alice dù sao đi nữa; không có cách nào để phát hiện ra rằng chỉ sử dụng dữ liệu đã cho). Nhưng đó là một vấn đề với vấn đề của @ ManyCookies như đã nêu, không phải với giải pháp của bạn.
Ilmari Karonen

@ManyCookies: Chắc chắn, điều đó cũng sẽ hoạt động :)
Tassle

@IlmariKaronen: Vâng, bạn có thể thêm bất kỳ số bước tiền xử lý nào bạn muốn để thực hiện nhanh hơn trong thực tế nhưng những điều này không thực sự cần thiết, trong khi bước tiền xử lý tôi đề xuất chủ yếu là để kiểm tra điều kiện dòng chảy tối đa dễ dàng hơn (không có nó bạn sẽ cần kiểm tra xem dòng chảy có bão hòa ở cả hai đầu hay không, nó sẽ sôi theo bước tiền xử lý đó).
Tassle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.