【ZJOI2010】网络扩容

【ZJOI2010】网络扩容

【题目描述】

给定一张有向图,每条边都有一个容量C和一个扩容费用W。这里扩容费用是指将容量扩大1所需的费用。求:
1、在不扩容的情况下,1到N的最大流;
2、将1到N的最大流增加K所需的最小扩容费用。

【输入】

第一行包含三个整数N,M,K,表示有向图的点数、边数以及所需要增加的流量。
接下来的M行每行包含四个整数u,v,C,W,表示一条从u到v,容量为C,扩容费用为W的边。

【输出】

一行包含两个整数,分别表示问题1和问题2的答案。

【输入样例】

5 8 2
1 2 5 8
2 5 9 9
5 1 6 2
5 1 1 8
1 2 8 7
2 5 4 9
1 2 1 1
1 4 2 1

【输出样例】

13 19

【数据范围】

30%的数据中,N<=100
100%的数据中,N<=1000,M<=5000,K<=10

【题解】

第一问是裸的最大流,点数也很少,随便一种算法就能过。

第二问是要扩大流量,等价于求一次最小费用最大流,图构造起来不算复杂。首先是保留上一问的残量网络,费用为0(已有的边是免费的),再将刚开始的所有边重新加入一遍,流量为INF(其实为k就够了),最后新建一个源点与原来的源点相连,流量为k,费用为0。新图的最小费用就是扩容的最小费用。

实际上,不必重新加入所有的边,在原残量网络中放大最小割上的边并修改费用也是可行的,只是这道题数据不强,不必麻烦了。

【代码】

第一问Dinic,第二问费用流,几乎0msAC~

【ZJOI2010】网络扩容

你可能感兴趣的:(解题报告)