网络流 从0开始学建图

1.HDU-3572

题意:N个任务,每个任务有Pi(需要干多少天),Si(开始时间),Ei(结束时间),M个机器,一个机器一天最多处理一个任务,询问是否所有的任务都能完成。

建图模型:

s 向 [1, 500]天开始建立一条流量为m的边,然后对于每天来说,往可以去执行任务的点建立一条流量为1的边,每个任务往 t 建立一条流量为Pi的边。

最后判断最大流和sum Pi是否相等。

 

2.HDU-3388

题意:填数问题。

建图模型:从S -> 行之和 -> 格子 -> 列之和 -> T。 为了保证每个点都至少是1,从行之和里抽格子数目的流量,放到S里,往每个格子链接1的流量。

最后看看流量确定格子的数值。

 

3.HDU-2883

 题意:和 (1) 一样, 就是数据大小不一样。

建图模型:将时间分成不同的单位格子, 然后每个任务与每个不同的单位时间建边。

 

 4.HDU-3879

题意:最大权闭合子图

建图模型:考虑一个最小割模型, 我们先将所有的正权值加入到答案里, 然后再把 s 与 所有的 正权点连边, t与所有的 负权点连边, 流量都为点权的绝对值。

再把 原图中的边 也建立对应的流量为inf的边。

这样考虑一个最小割, 我们只能将一个点从割到s这边, 或者是割到t这一边, 我们就是需要最小的代价, 将所有的点划分为1边就是答案了。

 

5.HDU-3472

题意:混合图判断欧拉路径

    1.首先判断图的连通性,若不连通,无解。

    2.然后任意定向无向边,计算每个点i的入度和出度之差deg[i]。若deg[i]为奇数,无解。

    3.设立源点s和汇点t,若某点i入度<出度,连边(s,i,-deg[i]/2),若入度>出度,连边(i,t,deg[i]/2);对于任意定向的无向边(i,j,1)。

    4.若有两个度数为奇数的点,假设存在欧拉路径,添加一条容量为1的边,构成欧拉回路,不影响结果。若全为偶数,直接最大流。

    5.若从S发出的边全部满流,证明存在欧拉回路(路径),否则不存在。

    ps:若要求输出路径,将网络中有(无)流量的边反向,加上原图的有向边,用套圈算法即可。

转自 

 

6.HDU-3315 

题意:带预配边的费用流匹配。

同样的费用的时候, 要优先选择预配边。

将边权*最大边权。 然后预匹配边的权值+1。 这样会优先流过来这条边。

 

7.HDU-4067

题意:给定一副有向图, 有S点和T点, S点的出度=入度+1, T点的入度=出度+1, 其他点的出度==入度。

现在图上的每条边都有保留这条边的权值,代价为a, 删除这条边的权值, 代价为b。

先贪心的保留边/删除边。

1.如果 a >= b, 保留这边, u的出度+1, v的入度+1, add(u, v, 1, b-a)

2.如果 a <= b, 删除这边, add(v, u, 1, b-a).

3.s的入度+1, t的出度+1.

4.然后 S 往 入度-出度>0的点建边, 入度-出度<0的点建边。

5.如果满流说明合法。

 

8.HDU-3820 

题意:给定一个n×m的矩阵, 现在有可以往矩阵里放金蛋 or 银蛋 or 不放蛋, 放了金蛋能得到aij的价值, 放了银蛋能得到bij的价值, 如果有一对金蛋相临就要减去s的价值,如果有一对银蛋相临就减去g的价值,求最大价值。

建边方式:

按奇偶建边。 将点分为奇偶, 然后将拆点分为左右点, 其中对于奇数点来说, S --- (aij) --- 左点 --- (inf) --- 右点 --- (bij) --- T

对于偶数点来说,  S --- (aij) --- 左点 --- (inf) --- 右点 --- (bij) --- T。

然后,对于相临的格子来说再把左边的银点往右边的银点建边, 左边的金点往右边的金点建边。

 

9.HDU-3947

转自:传送门

 

************

1. HDU 6634

 

posted @ 2019-08-04 20:46  Schenker  阅读(231)  评论(0编辑  收藏  举报