首页 > 代码库 > NKOJ 2017信息学夏令营第1场(图论专项练习)
NKOJ 2017信息学夏令营第1场(图论专项练习)
A题:
网络流最大流模型。
用 [1, m] 表示各个国家,[m+1, m+n] 表示各个餐桌。
从 s 向 i 连边,容量为第 i 个国家的代表数;
从 m+i 向 t 连边,容量为第 i 张餐桌的容量;
从 i 向 j + m 连边,容量为 1 ,这样就限制了每个国家在一个餐桌上至多有一个代表。
找到最大流,表示满足条件的代表数量最大值,再与提前计算出的代表总数量比较,
两者如果相等说明存在合理方案,输出 1 ,否则输出 0.
B题:
二分图的最大匹配模型。
我在比赛的时候考虑了费用流,在“如何避免顾客合资买鞋”“如何有钱人买一大堆鞋”
等问题上纠结了很长的时间,还考虑过拆点等……这应该算是题目容易误导人的地
方吧。当然,费用流是不可取的。
将鞋和顾客分别作为二分图的一个点集,从每双鞋向可以购买它的顾客对应的点连边。
然后是一个贪心过程,将 n 双鞋按照价格降序排列,以排序后的点为起点,依次找增
广路,每次 i 号鞋成功找到增广路则 ans += price[i] ,最后输出 ans。
用二分图做这道题就满足了“一双鞋只对应一位顾客”这个条件。
C题:
二分图最大匹配模型。
注意到主对角线上的点满足任意两点行号列号均不同的性质。因此如果原图中有任意
两个点同行或同列,则不可能通过行列交换得到符合条件的图(行列交换后两点仍在
同行或同列)。问题简化为:判断是否有两点同行或同列。将黑色棋子行号作为二分
图的一个点集,列号作为另一个,每颗黑色棋子的行号对应点和列号对应点相连。同
一个行号对应点若有多条连边,表示该行有多个黑棋,列号对应点也是这样。执行二
分图最大匹配,若匹配数量等于 n ,表明没有两点同行或同列,输出 Yes ,否则 输
出 No.
D题:
最小割等于最大流。
建一个网络流模型。
从 s 向 i 连边,容量为第 i 个实验的赞助费;
从 i 向 m+j 连边,容量为 inf ,j 为 i 号实验对应的仪器编号;
从 j 向 t 连边,容量为 j 号仪器的费用。
1 <= i <= m; 1<= j <= n;
最小割的实际意义是选用仪器的费用和最小,找出最小割等于最大流 flow 。
提前计算赞助费用和 sum ,则 sum-flow 就是答案。
另外这道题给出实验对应仪器编号时是以换行符结尾的,不能直接读,我用了类似
输入优化的手写输入(getchar() 函数)来解决这个问题。
NKOJ 2017信息学夏令营第1场(图论专项练习)