两道利用网络流来验证是否存在一种方案满足要求的题目 woj1124 sgu326

woj1124题意:说有n支队伍,要互相进行一些场次的比赛,一共还有m场没有比。给出每个队的总分以及m场的比赛情况。问是否有方案安排这m场比赛的结果,使得第n支队伍最后的总分大于其他任一支队伍的总分。一场比赛赢了得两分,输了0分,平了1分。(1<=n<=100,1<=m<=1000)

思路:

1.既然让你随便安排,那么先让第n支队伍的比赛全赢了,让第n支队伍的总分最大化,这样最稳,如果这时已经有队伍的总分大于第n支,那么怎么安排其余的场次都没有用了。

2、然后安排其他的比赛。为了让其他的队伍不能追上第n支队伍的总分,那么每支队伍提升分数的范围就被限制在了0~(sum[n]-sum[i]-1),也就是每支队的需求只能是这些。

3、那么每场比赛我们就可以看作是供给,第i场比赛能提供的分数一共就两分,所以,我们对第i场比赛建边(s,i,2),然后对进行i场比赛的两只队建边(i,x,2),(i,y,2).表示这场比赛x可赢,y可赢,也可平,因为容量就是2,流的话只有这三种情况,是的,符合题意。然后对每支球队建边(x,t,sum[n]-sum[x]-1).然后最大流一下。看最后的最大流是否等于2*比赛场数,是则yes,否则no。

4.想一下为什么满足上述条件就行了呢,那小于又是什么意思,没有大于这种情况。首先我们只有2*比赛场数的供应,有Σ(sum[n]-sum[i]-1)(1<=i<n)的需求。如果满流了(即等于),也就是说供应小于等于需求,此时代表的意义就是我们有一种比赛安排方式使比赛都比完了也只能满足每支队的分数比第n支队少一分,或者更少。如果最大流小于2*比赛场数,那么也就是说所有的队伍的需求都满了,即所有的队伍都被提升到距第n支队伍只差一分,但还剩下比赛,不管那场比赛谁胜谁赢,或者平,都会有一支或两支队伍的分数跟第n支队伍持平或超过。

代码就不贴了,反正是模板。


sgu326

题意:nba的球队分为很多组(有几组都没关系),球队之间会进行小组内的比赛和小组间的比赛。给出n支球队目前胜利的场数,和还要比的场数(包括小组内的和小组间的)以及小组内各队还要比的场数。问是否存在一种比赛结果的安排使得球队1最后的胜利场数至少和小组内任何一支其他球队一样。

输入是,先给n,然后是n个场数,再给n个场数,然后给个n*n的矩阵表示小组内各队要比的场数。

思路:

1、跟上题一样.首先让1队不管组内或组间的比赛都赢了,其他同组的队伍组间的比赛都输,就是第二个n个场数里面除了1队的还要比的场数,其余的不要管就好了,1队赢得越多,其他队越少越稳.若做完上面操作1队还落后其他队那么就直接no。

2、下面只考虑小组内的比赛,首先对矩阵里面的有比赛的点(即num[i][j]>0,i<j)连边(s,x,num[i][j]),(x表示这是第几个大于零的点),然后对该点相关的两个队连边(x,i,num[i][j]),(x,j,num[i][j]),然后每支球队(除了1队)连边(y,t,sum[1]-sum[j])。然后最大流一下,看最大流是否==Σ(num[i][j]).道理跟上题一样。

3、有看到这个题与i点关联的两个队有连边(x,u,inf),(x,v,inf)的,这个题我看着跟上面思路一样就没有写代码。我想两种建边方式都行吧。反正从(x,i)和(x,j)流过的流量最多也就num[i][j]。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值