一、实验目的
- 掌握网络流的相关概念
- 掌握求最大网络流的增广路算法思想;
- 针对具体问题,能够利用增广路算法求解最大网络流
- 能够编写代码实现增广路算法
二、实验平台
1. Windows操作系统或Linux操作系统;
2. Python3.x;
3. PyCharm或Sublime或Jupyter Notebook。
三、实验内容
方格取数问题: 在一个有m×n个方格的棋盘中,每个方格中有一个正整数。现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大。试设计一个满足要求的取数算法。对于给定的方格棋盘,按照取数要求编程找出总和最大的数。
四、算法设计
- 问题分析
(1)所选实验项目给定的已知
在给定的m×n个方格的棋盘中,选取不相邻的若干个方格,并使得这些方格内的数之和最大。
(2)求解目标
在给定的m×n个方格的棋盘中,选取不相邻的若干个方格,并使得这些方格内的数之和最大。
(3)条件
m×n的方格棋盘,每个方格内有一个正整数。选取的若干个方格之间不能存在公共边。求取出的方格中所有数字的和的最大值。
- 问题建模
假设方格棋盘中第i行第j列的数为a[i][j],对于两个方格(i_1,j_1)) 和 (i_2,j_2),它们之间有公共边当且仅当满足以下关系之一:
1,i1=i2,j1=j2±1
2,i1=i2±1,j1=j2
因此,可以将每个方格看做一个节点,如果两个节点之间没有公共边,则它们之间连一条无向边。这样得到的图是一个二分图,其中一个部分是黑点集,另一个部分是白点集。我们需要在这个二分图上选择权值和最大的点集,并且保证所选的点之间没有公共边。
- 算法描述
我们可以使用搜索算法来求解最大独立集。具体来说,我们从棋盘的第一个方格开始,分别考虑两种情况:选这个方格和不选这个方格。如果选这个方格,则不能选与其相邻的方格,因此我们需要将与其相邻的方格标记为不能选。然后,我们继续递归考虑下一个没有被标记为不能选的方格。如果不选这个方格,则直接递归考虑下一个没有被标记为不能选的方格。最后,我们比较选取和不选取这个方格的结果,选取最大值即可。
数据结构:我们可以使用一个二维数组来表示棋盘,用一个一维数组来记录哪些方格不能被选,一个变量来记录当前已选数的总和以及一个变量来记录当前最大的总和。
五、算法源码
#incl |