能够编写代码实现增广路算法方格取数问题: 在一个有m×n个方格的棋盘中,每个方格中有一个正整数。现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大。试设计一个满足要求的取数算法。对于给定的方格棋盘,按照取数要求编程找出总和最大的数。并给出问题分析、 算法描述、 输入样例、 输出样例,程序代码、 输出结果、时间复杂度分析、优化改进
时间: 2023-07-14 07:14:23 浏览: 93
问题分析:
这是一个典型的图论问题,可以用最大权闭合子图或者匈牙利算法来解决。但是这里我们使用增广路算法来解决。
首先,将每个格子看作一个节点,然后将图中的每一行和每一列均分成两个点集合,分别为左点集合和右点集合。如果一个格子在第i行第j列,则将其与第i个左点和第j个右点相连。这样就得到了一个二分图。接下来,将左点集合中的所有点都连接到源点(超级源点),并将右点集合中的所有点都连接到汇点(超级汇点)。然后,我们就可以将这个问题转化为从源点到汇点的最大流问题。
但是,由于我们的图是二分图,因此可以使用Hopcroft-Karp算法或者Dinic算法来求解最大流。这里我们使用Dinic算法来求解最大流。
最后,我们需要找到所有在最大流中的正向边(即流量为1的边),这些边所连接的两个节点所代表的格子中的数字就是我们所要选择的数,其总和就是最大权值。
算法描述:
1. 构建二分图:
- 将每个格子看作一个节点;
- 将每一行和每一列均分成两个点集合,分别为左点集合和右点集合;
- 如果一个格子在第i行第j列,则将其与第i个左点和第j个右点相连。
2. 求解最大流:
- 将左点集合中的所有点都连接到源点(超级源点);
- 将右点集合中的所有点都连接到汇点(超级汇点);
- 使用Dinic算法求解最大流。
3. 找出所有在最大流中的正向边:
- 找到所有在最大流中的正向边,这些边所连接的两个节点所代表的格子中的数字就是我们所要选择的数;
- 计算所选数的总和,输出结果。
输入样例:
4 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
输出样例:
57
程序代码如下:
阅读全文