如何确定联赛表是否可以接受?

时间:2019-06-21 09:06:16

标签: algorithm max-flow

让我们考虑一个由 n 支球队组成的联盟,其中每支球队对阵所有其他球队两次,结果是三种可能的结果:赢,输或平。一场胜利需要2分,平局1分,亏损0分。我们想确定一个联赛表是否可以接受。

我正在尝试实现多项式时间算法来解决此问题。我曾考虑过使用网络流技术(如Kleinberg&Tardos的“算法设计”的第7章中所述),但没有提出任何具体的建议。

理想的解决方案应该是这样

    IsAdmissible
    Input: Final league table
    {
         ...
    }
    Output: TRUE if there's a combination of matches resulting in given table
            FALSE otherwise

2 个答案:

答案 0 :(得分:0)

网络流量是解决方案。

尝试以下网络: enter image description here

在一侧,为每一对构造一个顶点。 另一方面,对于每个团队。

s 对球队的权重根据输入表而定,两对到 t 的权重为4(两场比赛)。

答案 1 :(得分:0)

快速的初步检查:所有团队的分数总和必须满足:

  • 20 * 19 * 2≤和≤20 * 19 * 3

每支球队出战38场比赛,每场比赛可以得分0、1或3分。 每个团队的总分s必须满足:

  • d + 3 * w = s,其中d和w是非负整数(d-平局次数,w-获胜次数)
  • d + w≤38

很容易找到每个团队的所有有效(d,w)。

如果每个团队都有有效的(d,w),则该表是可接受的,例如:

  • 对于任意2支球队,总和(w)≤38 + 36
    对于任何3组,总和(w)≤38 + 36 + 34
    对于任何n支球队,总和(w)≤38 + 36 + ... +(40-2n)

    (按得分递减的顺序对球队进行排序;对每个n进行一次检查就足够了)

  • 总和= 4560-2 *总和
  • 总和(w)=总和-1520

上面的两个方程式来自以下事实:

  • 总和=总和+ 3 *总和(抽奖= 1分,胜利= 3分)
  • 总和(d)/ 2 +总和(w)= 20 * 19 * 2(每局以赢球或两次平局结束)

所有这些条件都是必需的。我相信(但不确定)它们已经足够。