2018年1月31日训练日记

新知识:二分图最大点权独立集=所有点权之和-二分图最小点权覆盖。

一道经典题目:POJ 1637 - Sightseeing tour 判断混合图是否是欧拉回路(最大流)
题意:给你一个图,有的边为有向边有的边为无向边,问能否有一条路径从某点出发又回到该点并且所有的边只经过一次。
思路:判断混合图欧拉回路的裸题。解法是先任意将每个无向边定向,然后来调整,看能否满足有向图欧拉回路的条件(所有点入度=出度)
具体的:在把所有无向边定向后,先看每个点入度和出度之差,若有一个点其为奇数,则说明impossible。因为就算后面调整,调整一个边的方向,两头的点入度出度之差的变化必然为偶数,所以若为奇数,无论如何调整都无法使其变成0,然后就要看能否经过调整变成一个欧拉图了。所有无向边定向后起点到终点连一条容量为1的边,然后设一个超级源点,向所有所有出度多了点做边,容量为其多了的边数/2(因为每次改变边出度-1,入度+1,之差变化2)所有入度多了的点往一个超级汇点做边,容量为其多了的边数/2,跑最大流,然后看和超级源点连得边是否容量都空了,与超级汇点连得边是否容量都空了。如果都空了,则说明是可以构造成欧拉图的。

注意:此类问题一定不要忘记判断连通性!!!
构边理由:

1、是无向边两点间容量为1的边,代表这个无向边至多改变方向一次。
2、超级源点和超级汇点的边代表连着的这些点要让入度出度之差为0,所以要从左侧出度多的,调整到右侧入度多的,如果这些边都为0,就说明了可以让所有的点入度=出度。
总结此类模型的特点: 整个对象可以分成两个集合,并且其中一个集合是要从另一个集合中获取资源,而另一个集合也必须要释放资源,使得两个集合的资源都正好。(by zzyzzy12)

给牛分配食物、饮料这类问题总结:这类问题的特点是求最大or最小值,并且资源的拥有有互斥和数量限制。

最大流好题:HDU 2883

题意:卖烧烤,一小时最多烤M个羊肉串,每个顾客有四个值si (到达的时间), ni (需要的羊肉串数量), ei (离开的时间) and ti (烤一个羊肉串的时间),问能否让所有的顾客都满足要求。
官方题解: 将所有的到达时间和结束时间按升序排序,得到 x <= 2n-1 个时间区间。建立网络流模型:s为源,t为汇,每个顾客i作为一个结点并连边(s, i, ni*ti),每个区间j作为一个结点并连边(j, t, (ej-sj)*M),其中sj, ej分别表示区间j的起始时间和终止时间。对任意顾客i和区间j,若 [sj, ej] 完全包含在 [si, ei] 之中,则连边(i, j, INF)。若最大流等于 ∑ni*ti 则是 Yes,否则是 No。

个人总结此类问题:s连需求的主体,时间连t,根据主体对时间的需求建边。

另外,在做HDU 4280时,我用的dinic优化模板和ISAP模板都超时了。去题解找了份模板,通过测试,优化输入后时间减少了124ms(用了read()),而放结构体里可以省将近一半的内存,但是时间会长一些。但是比较HDU 3549 却相对来说慢了些。。。还是dinic优化模板和ISAP模板快。。。

今晚准备打一场cf,今年还没打过。。。希望不会掉分。。。

明天继续看图论,感觉有那么点意思了。。。加油吧。

你可能感兴趣的:(训练日记,图论,网络流)