A和B有五种不同的人物,共$n$个,两人之间要比$m$场。A的的$i$个人物的寿命为$hpA_i$,B的为$hpB_i$。
每一次A和B选出不同的人物进行PK,每一次PK使得两边人物的寿命$-1s$,当寿命为$0$时就不能比赛了,两个人之间只能比一场。
同时,当J的寿命为$0$时,同一棵树上的YYY可以为他$+1s$。每个YYY只能给每个J续一次,最大化A能赢的场次的数目。
题解
一个比较巧妙的网络流建模题。
首先打出人物之间输赢的表,然后考虑从源点像A的第$i$个人物连边,容量为$hpA_i$,从B的第$i$个人物像汇点连边,容量为$hpB_i$。
以上连边,如果第$i$个人是J,则将容量增加本方YYY的数量。
对于A的第$i$个人能赢B的第$j$个人,就从A的第$i$个人向B的第$j$个人A的人连边,容量为$1$。跑一边最大流即可。
下面分析为什么这样连边是对的。
先不考虑续命,这个人物不能出战即找不到经过这个人物的增广路,而通过这个人物的增广路只能是从源点直接到这个人物再到后面或是前面找到的增广路到这个人物再到汇点。
以上这句话很重要,请仔细理解。所以,当源点到这个人物或这个人物到汇点的边为零流边就找不到增广路了,即这个人没命了。所以从源点发出或到汇点连边是正确的。
由于两个人之间只能比一场,而题目要求只求胜利场次数,所以中间的连边也是正确的。
现在考虑续命。对于一个J,无论YYY是死是活,总能在它死的时候续命,对于每一个J都是一样。所以将从源点连到J的边或是J连到汇点的边的容量增加本方YYY的个数。
至此,连边的正确性就已经说明清楚了。
代码
1 |
|