对于一张给定的 运输网络 ,Alice 先确定一个最大流 ,如果有多种解, Alice 可以任选一种; 之后 Bob在每条边上分配单位花费 (单位花费必须是非负实数), 要求所有边的单位花费之和等于 P。总费用等于每一条边 的实际流量乘以该边的单位花费。 需要注意到, Bob在分配单位花费之前,已经知道Alice 所给出的最大流方案。
现在 Alice 希望总费用尽量小,而Bob希望总费用尽量大。我们想知道, 如 果两个人都执行最优策略 ,最大流的值和总费用分别为多少。
对于 100% 的测试数据: N≤100 ,M≤1000 。 对于 100% 的测试数据: 所有点的编号在 1..N 范围内。 1≤每条边 的最大 流 量≤50000 。1≤P≤10 。给定运输网络中不会有起点和 终点 相同的边。
显然Bob要把所有费用全部分配给实际流量最大的边。 所以Alice在满足最大流最大之余,使得流量最大的边最小。 所以二分后再用最大流判断就可以了。
要注意的是网络流的实现时的问题:
double gap(int v,double flow){ int i,k; double use=0,j; if (v==n) return flow; for (k=fi[v];k;k=ne[k]) if (bz[la[k]]+1==bz[v] && Abs(va[k])>eps){ j=gap(la[k],min(va[k],flow-use)); use+=j; va[k]-=j; va[k^1]+=j; if (Abs(flow-use)<eps || bz[1]==n) return use; } if (!--card[bz[v]]) bz[1]=n; card[++bz[v]]++; return use;}1.三个中两个return返回的都是use; 2.当use==flow使,直接返回use; 3.到达汇点,返回flow。
新闻热点
疑难解答