POJ - 2175 Evacuation Plan (网络流, SPFA 消去
题意:有 N 栋大楼,M 个避难所,每个大楼里有 Bi 个人,每个避难所有 Ci 的容量,人去避难所避难,
现在给你一个避难的计划,问你这个计划是不是最优的,如果不是最优的,那就找一个比这个优的方案,并输出来。
思路:问的是,这个方案是不是最优的,如果不是,输出一个更优的,并不是输出最优的。
我们要知道,最小费用最大流 等价于 跑完图之后,这个图没有 负环。
所以这个题就可以看看?残余网络上 有没有负环,如果没有,那么就是最优的解,如果有负环,在负环上增广一下,那就是更优的解了。
首先我们就要见残余网络的图。
0? 源点
1 ~ n 建筑物
n + 1 ~ n + m? 避难所
n + m + 1 汇点
1、首先 人要去避难,, 建筑物 到? 避难所 要建一条权值为距离的边
2、在给定的计划上,i 到 j 有人避难, 所以要建一条反向边, 权值为 负的。
3、在 j 这个避难所,是不是有避难的人,如果有,建一条从? 汇点 到 j 的权值为 0 的边。
为什么?我的想法是, 人可以从 j 走到汇点,然后就要再一条 反向边。
如果 避难的人 没有超过当前避难所的容量,那就要建一条 从 避难所 到 汇点 的 权值 为 0 的边。
为什么? 因为,还有人可以从避难所走到汇点。
避难所就相当于汇点,不过避难所有多个,所以要一个超级汇点把避难所连接起来。
如果到了避难所,就相当于到了汇点,避难所有人,相当于到了汇点,然后建一条反向边,
如果避难所的人等于避难所的容量,相当于都到了汇点,就不会有人 还能从避难所到汇点,这种情况就不能建一条从避难所
到汇点的边,否则就建一条从避难所到汇点的边。
之后就是,SPFA? 判断负环,如果有一个点的入度 > 点的总数,说明有负环,那就退出来,
但是这个点不一定在负环中,所以我们就要找到负环,
从当前点找前驱,如果有一个点的出现过了,说明这个点在负环中。
然后就是在负环中增广, 改变流量,找最优值。
这个就是看负环的流向了。