ST03Day7 网络流

正题

      昨天断更了,因为阶段性测试,然后上午讲的是最小生成树和最短路,没什么好讲的,就没有写。

      时间复杂度

      Dinic:每次bfs分层,dfs找增广路,暴力加,当前弧优化,O(n^2m)

      Dinic的时间复杂度很玄学,在大部分情况下都远远好于上面这一个复杂度,下面是两个例子:

      1.如果容量只有1,时间复杂度不超过O(\min(n^{\frac{2}{3}},m^{\frac{1}{2}})m)

      2.如果除源汇之外每个点入度只有一条且容量为1 或 出度只有一条且容量为1,那么时间复杂度O(\sqrt{n}m)

      也就是说用最大流跑二分图匹配的时间复杂度是第二种情况。

      最小费用最大流(EK):O(SPFA(n,m)*f)),f是流量。

      最大流最小割定理

      这俩东西是相等的,可以用线性规划证明。

      如何找最小割的方案?从S开始在残余网络上dfs,能dfs到的边就是属于S集的,否则就是属于T集的,如果一条边将S到T连起来了,那么这条边就叫做割边。那么这组割恰好等于最大流,所以这组割就是一组最小割。

      例题

      比较显然的例题就不多说了,讲讲我原来不知道的。

      T1    

      对于每个小朋友建一个点:

      最小割建图。 本来是同意的,S->i(o),i->T(o+1)。

      本来是反对的,S->i(o+1),i->T(o)。 好朋友a,b,a--b(1)。

      o取一个较大的数。o是为了保证不两边都割,割两边分别表示同意/不同意,如果割的不同侧就需要多割中间好朋友那条。

      因为如果割的是不同侧,两个小朋友之间的连边和这两个小朋友未被割掉的边形成了一个路径,联通了S和T,所以要用1的代价来割断它,也就产生了1的冲突,这里的o是一个很大的值,它是用来保证一个点的两条边不同时被割断,因为它可以使割断两条边的代价变得很大,但在这道题中,不可能割断两条边,因为一个点只可能属于S或T集,那么这两条边就只可能有一条被割,否则矛盾。

      T2

      有n门课程和m个学期。 有一些课程有先修课程,输入k个限制,形如a[i]是b[i]的先修课程。 每一门课程在每个学期可能获得不同的绩点。 你需要修完所有课,并输出可以获得的最大绩点,你的绩点就是每门课的绩点的平均值

      

      类似这样建图,若在a[i]的第x次割断,b[i]的第y次割断(y<=x),那么就会产生一条S到T的通路,需要多割一条路径上的边,由于我们用o限制了1个课程只能有1次被割断,所以就满足条件了,另外当最小割>1e9时无解,因为这时相当于有一条从S到T的正无穷通路,也就是说最长链比天数还长。

      T3

      文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科。他的班级可以用一个n*m的矩阵进行描述,每个格子代表一个同学的座位。每位同学必须从文科和理科中选择一科。同学们在选择科目的时候会获得一个满意值。满意值按如下的方式得到: 1.如果第i行第j列的同学选择了文科,则他将获得art[i][j]的满意值,如果选择理科,将得到science[i][j]的满意值。 2.如果第i行第j列的同学选择了文科,并且他相邻(两个格子相邻当且仅当它们拥有一条相同的边)的同学全部选择了文科,则他会更开心,所以会增加same_art[i][j]的满意值。 3.如果第i行第j列的同学选择了理科,并且他相邻的同学全部选择了理科,则增加same_science[i][j]的满意值。 小P想知道,大家应该如何选择,才能使所有人的满意值之和最大。请告诉他这个最大值。bzoj3894

      这题对于每一个同学建一个点,S向每个同学连容量为sci的边表示选文,每个同学向汇点连一条容量为art的边表示选理,对于每个自己与周围的同学,连向一个新建的点,流量为正无穷,这个点向汇点连一条这些同学同时选文的收益。 然后用全部的值减去最小割就可以。证明考虑,若有一个不选文就会产生一条从S到T的路径,要把收益割掉,否则就要将选文的代价割掉,显然正确。上述建边与证明理科同理。

      T4

      n*m的棋盘,每个点有选择代价和控制收益。 一个点被控制当且仅当它被选择或者它的邻居都被选择。  Topcoder SRM 558

      考虑黑白染色,要么就是自己被选,要么就是自己不被选且周围四个被选,连向黑点的边和连向白点的边反一下就可以套文理分科模型。

      T5

      n*m的棋盘,有些格子有棋子。 每次可以拿走同行或同列若干连续棋子,求至少需要多少次操作可以拿走所有棋子。

      考虑将棋子建点,S连向一个棋子,容量为o表示棋子在列被拿掉,一个棋子连向T表示棋子在行被拿掉。然后相邻的棋子直接考虑文理分科模型。

    

猜你喜欢

转载自blog.csdn.net/Deep_Kevin/article/details/108159914