给出0和1的N * M数组。 湖是一组水平或垂直相邻的单元格(1)。 通过将一些像元(0)更新为1,我们将连接地图上的所有湖泊。 我们的任务是找到在给定的时间限制内更新的单元数最小的方法。
我发现了类似的问题:here
有关此主题的解决方案遇到了一些问题:
1)它使用lib(纸浆)解决任务
2)获取输出需要时间
是否有针对此问题的优化解决方案
提前谢谢
答案 0 :(得分:0)
我认为这是一个棘手的问题,但是如果您将其真正绘制出来并将其视为图形,则将使其变得更加简单。 将每个像元视为一个节点,并将与其上/右/下/左的每个连接视为一条边。 首先将湖泊的边缘连接到附近的顶点。保持每个顶点相同,如果不创建循环,则仅连接两个顶点。 在此阶段,对湖泊的直接邻居执行相同的过程。继续这样做,并在其创建周期中断。 之后,您应该有一棵相连的树。
一旦连接了树,就可以找到树的所有关节点(剪切顶点)。 (无向连接图中的一个顶点是一个连接点(或切割的顶点),如果将其移除(以及穿过它的边)会断开该图的连接。连接点表示连接网络中的漏洞-单个点的故障会将网络分成2个或2个点。更多断开连接的组件)
树中切出的顶点数量(不包括初始湖泊)将是您需要更改的最小单元数。
您可以搜索有很多有效的方法来查找图形的割点。 找到铰接点需要O(V + E) 预处理需要O(V + E),因为它有点像BFS。
答案 1 :(得分:0)
不知道您是否仍然感兴趣,但是我有一个主意。最小成本流算法呢?
假设您有一个m * n 2维输入数组和i个岛。创建一个图形,其中二维数组中的每个位置都是一个节点,并且每个邻居有4条边。每个边缘将在以后分配成本。每个边的最小容量为0,最大容量为无限。
选择一个随机岛作为源。创建一个额外的节点目标,并将其连接到除源之外的所有其他孤岛,每个新边的最大和最小流量为1,成本为0。
现在分配旧的边成本,以便连接两个岛节点的边不花费任何费用,但是and岛和水节点之间的边或两个水节点之间的边的花费为1。
计算该图的最小成本流。初始图生成可以在n m中完成,而最小成本流算法可以在(n m)^ 3
中完成