Baseball Elimination

1. 问题描述

Princeton algorithms-part2第三周的编程作业:Baseball Elimination,给出各个参赛棒球队的比赛信息,利用算法分析出哪支队伍应该被淘汰。下面直接给出队伍会被淘汰的两种情况:

1.1 示例

i team w[i](wins) l[i](loss) r[i](left) Atl Phi Ny Mon
0 Atlanta 83 71 8 - 1 6 1
1 Philadelphia 80 79 3 1 - 0 2
2 New York 78 78 6 6 0 - 0
3 Montreal 77 82 3 1 2 0 -

每一行是各参赛队伍的比赛信息,其中:
w[i] 表示第i支队伍当前赢得场次
l[i] 当前输掉场次
r[i] 剩余比赛场次
g[i][j] 对应每行后4列,在剩余的比赛场次中,与其他各队伍的比赛次数
被淘汰的规则是:如果哪一只队伍在所有比赛结束时,仍不可能赢得最多场次(或并列),即被淘汰。不考虑队伍退赛等特殊情况。

1.1.1 简单情况

例如球队Montreal,当前赢得场次77,剩余3次比赛,因此它在比赛结束时赢得的最多场次为80,仍然低于Atlanta当前得分83,因此应被淘汰。

1.1.2 复杂情况

乍看之下Philadelphia队在比赛结束时最多能拿到83场,恰好并列第一。但当Philadelphia队在比赛结束时赢得最多的话,就意味着Atlanta在剩余的8场比赛中一场也没有赢得,包括输掉了与New_York对决的6场比赛。这意味着什么呢?New_York会赢得6场比赛,并且最终得分为84,超越Philadelphia队,因此Philadelphia队实际应被淘汰。如何把像Philadelphia队这种漏网之鱼找出来呢,这就要用到Princeton algorithms-part2第三周介绍的算法max-flow.

2. 解决方法

2.1 建模

2.1.1 图中的结点

首先针对解决该问题的算法(max-flow)建立相应的数据结构————加权有向图。每次要评估一支队伍会不会被淘汰出局时,建立的图都是不一样的。图的结点包括一个只有出度的源结点s和一个只有入度的目标结点t,剩余的结点包括所有队伍(除了要评估的队伍),所有要进行的比赛(不包括评估队伍参与的比赛)。这样我们可以来算一下图中会有多少结点,假设n支队伍,st2个结点,代表各队伍的结点n-1个,剩余的n-1支队伍中两两之间会有比赛,也就是有$ C_{n-1}^2 $个个结点,因此结点总数共有$ 2+(n-1)+C_{n-1}^2 $个,个人理解 : )

2.1.2 边的capacity

图中各边的capacity原文中有定义。s到各比赛结点边的的capacity为g[i][j](假设该比赛结点代表队伍i和j之间的比赛,capacity即为他们之间的比赛场数),比赛结点到队伍结点之间的capacity认为无穷大,队伍结点到t间的capacity为评估结点最多赢得的比赛(当前得分加上剩余比赛场数)减去该队伍当前赢得比赛。

2.1.3 图的直观表示

假如说我们现在要对Philadelphia队进行评估,判断它是否要被淘汰出局,那么根据上述参赛队伍的信息,建立出来的图在直观上应该如下所示:


建立的图

2.2 评估方法

最后计算出前面所构建的图的max-flow后,如果所有来自s的边的flow都达到了它的capacity的话,则认为不存在队伍能在比赛结束时赢得比评估队伍更多的场次,即评估结果是不被淘汰;反之评估为淘汰。
小小的分析一下,这种解法还是很有道理的。假如一个队伍i评估的结果是不会被淘汰,那么其他所有队伍的最终得分都不应该超过这个被评估队伍可能的最大得分,即w[i]+r[i]。所以在剩余的比赛中(也就是从s点出发的各边的capacity之和),每个队伍的得分都不能超过w[i]+r[1]减去他们自己的当前得分,这就是各队伍到t结点的capacity。
如果最终s点出发的各边flow都达到了capacity,说明这些队伍使尽了洪荒之力(完成了剩余所有比赛)最后取得的最好结果也只是和被评估的队伍势均力敌,那么被评估的队伍当然不应该被淘汰。
如果从s点出发的某些边的flow没有达到其capacity,说明剩余其他队伍有的还没完全发挥(没有完成剩余所有比赛),就已经赢到了被评估队伍最多可能赢得的场次,被评估队伍必然拿不到第一或并列第一了,所以此时应该被淘汰出局。
由于图的max-flow和最终来自s结点的所有flow之和相等,所以在实际写代码时,我们可以直接调用algs4库中的API,计算出所构建图的max-flow,并与来自s点的capacity之和比较大小即可得出评估结果。

3. 代码

完结撒花的同时,最后附上完整代码代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,201评论 0 25
  • 你有没有过这样一个异性朋友,在你悲伤失落时,希望他可以陪着你。你们虽然不是情侣,但是却是彼此生命中不可替代的风景...
    荒野如筝阅读 513评论 0 0
  • 多少次梦回大学校园 一群青葱少年 肆意玩闹 如果不是被闹钟闹醒 我想我会一直不愿醒来 是什么 让那些年这么令人怀念...
    小夕521阅读 262评论 0 0
  • 本来没抱任何希望会过一面的,结果过了一个礼拜左右,竟然收到了二面的通知,这次还是电面。 1. 自我介绍 2. 对前...
    Cynthia_英子阅读 344评论 0 0