3232: 圈地游戏
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 883 Solved: 422
[ Submit][ Status][ Discuss]
Description
DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用。
DZY喜欢在地里散步。他总是从任意一个格点出发,沿着格线行走直到回到出发点,且在行走途中不允许与已走过的路线有任何相交或触碰(出发点除外)。记这条封闭路线内部的格子总价值为V,路线上的费用总和为C,DZY想知道V/C的最大值是多少。
Input
第一行为两个正整数n,m。
接下来n行,每行m个非负整数,表示对应格子的价值。
接下来n+1行,每行m个正整数,表示所有横向的格线上的费用。
接下来n行,每行m+1个正整数,表示所有纵向的格线上的费用。
(所有数据均按从左到右,从上到下的顺序输入,参见样例和配图)
Output
输出一行仅含一个数,表示最大的V/C,保留3位小数。
Sample Input
3 4
1 3 3 3
1 3 1 1
3 3 1 0
100 1 1 1
97 96 1 1
1 93 92 92
1 1 90 90
98 1 99 99 1
95 1 1 1 94
1 91 1 1 89
1 3 3 3
1 3 1 1
3 3 1 0
100 1 1 1
97 96 1 1
1 93 92 92
1 1 90 90
98 1 99 99 1
95 1 1 1 94
1 91 1 1 89
Sample Output
1.286
HINT
Source
01规划and最小割
原式转化为V/C >= mid
则V - mid*C >= 0
我们二分这个mid,建一张图
事实上我们要做的是找一个让左式最大的方案
从源点向所有格点连边,边权为格点的权值
在图周围设一圈虚拟点,向汇点连正无穷的边
原图中的边变成无向边加入图中,容量为mid*边权
这张图上,,源点向格点的边满流说明我们舍去这个点
格点之间的边满流说明我们选择这条边为割
判断格点权和 - MaxFlow >= eps
(因为题目的特殊,所有格点不选也是一种方案,但是这一定很糟)