[置顶] 平面图最小割转最短路问题

前段时间遇到100W点400W边的最大流,直接怂了,秒T

然后百度知道了平面图的最小割可以转化成最短路来做

所谓平面图,就是类似于网格那样的图,看这个题  

1170: 一网打尽

Time Limit: 10 Sec   Memory Limit: 128 MB
Submit: 63   Solved: 16
[ Submit][ Status][ Web Board]

Description

        一天关押危险犯人的监狱突然爆炸了,里面的犯人都逃了出来。这些犯人以前都是一个犯罪团伙的,他们都要逃到他们的老巢!这可万万不得了!
         警方立即动员起来,派出警察来拦截他们。
         如图:
[置顶] 平面图最小割转最短路问题_第1张图片
整个地图是一个网格图形,坐标(x,y)表示第x行的第y个点。监狱在左上角,犯人的老巢在右下角。左上角点为(1,1),右下角点(N,M),上图中(N=3,M=4)。有两种类型的道路,1:(x,y)->(x+1,y);2:(x,y)->(x,y+1)。图上的权值表示这条道路上最多能通过的犯人数目。
         现在警方要派人埋伏在这些道路上伏击,为了不遗漏任何一个逃犯,如果一条道路上最多通过K个犯人,同样也要派出K个警察,才能完全封锁这条道路。请帮助警方安排一个伏击方案,使派出的警察数量最少,且抓到所有犯人。

Input

第一行为一个整数T,表示测试数据的组数
接下来个给出T组测试数据,对于每组测试数据:
第一行为两个正整数N,M(2<=N,M<=1000)表示网格大小
接下来分两部分,这两部分用一个空行隔开
第一部分:
共N-1行,每行M个数,表示纵向道路的最多允许通过犯人数目
即:第x行的第y个数表示是边(x,y)->(x,y+1)上的最多允许通过犯人数目
第二部分:
共N行,每行M-1个数,表示横向道路的最多允许通过犯人数目
即:第x行的第y个数表示是边(x,y)->(x+1,y)上的最多允许通过犯人数目
 
数据保证边上的权值小于1000。数据的大小不超过10M

Output

对每组测试数据,输出一个整数,表示参与伏击的警察的最少数目

Sample Input

1
3 4
3 4 1 8
5 2 4 9

5 10 1
6 1 3
2 3 10

Sample Output

6

这个上面的图就是平面图,然后找最小的警察,就是最小的割集,使s和t不连通
就是求最小割咯,然后最大流秒T,ISAP都扛不住
平面图转化为最短路,推荐08年OI论文周冬《两极相通——浅析最大—最小定理在信息学竞赛中的应用》
就是把面当成点,建一个对偶图

然后可以用dijkstra+heap跑个最短路就好了
这个就当dijkstra+heap的模版把,这种网格图,边比较多,这个的复杂度是O(nlogn),相对spfa是O(ke),边太多所以spfa比较慢
AC代码 :  http://paste.ubuntu.net/12721246/




你可能感兴趣的:(ACM)