首页 > 代码库 > 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场(图论专项练习)