原题:
太空飞行计划问题
问题描述: W 教授正在为国家航天中心计划一系列的太空飞行。每次太空飞行可进行一系列商业性实验而获取利润。现已确定了一个可供选择的实验集合 E={E1,E2,...,Em},和进行这 些实验需要使用的全部仪器的集合 I={I1,I2,...In}。实验 Ej 需要用到的仪器是 I 的子集 RjÕI。 配置仪器 Ik 的费用为 ck 美元。实验 Ej 的赞助商已同意为该实验结果支付 pj 美元。W 教授的 任务是找出一个有效算法,确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才 能使太空飞行的净收益最大。这里净收益是指进行实验所获得的全部收入与配置仪器的全部 费用的差额。
́编程任务: 对于给定的实验和仪器配置情况,编程找出净收益最大的试验计划。
́数据输入: 由文件 input.txt 提供输入数据。文件第 1 行有 2 个正整数 m 和 n。m 是实验数,n 是仪器数。接下来的 m 行,每行是一个实验的有关数据。第一个数赞助商同意支付该实验的费 用;接着是该实验需要用到的若干仪器的编号。最后一行的 n 个数是配置每个仪器的费用。
́结果输出:
程序运行结束时,将最佳实验方案输出到文件 output.txt 中。第 1 行是实验编号;第 2 行是仪器编号;最后一行是净收益。
输入文件示例
input.txt
2 3
10 1 2
25 2 3
5 6 7
输出文件示例
output.txt
1 2
1 2 3
17
题目大意:有n个实验,每个实验需要一些器材,器材需要耗费资金,而实验可以获得赞助资金,问做哪些实验可以获利最大,并输出。
分析:很容易构建一个图论模型,按照原题所给条件建边,如果实验i需要器材j,那么有i到j连一条方向为i->j的边,那么问题便转化为在这个图中选取一些实验点,一旦实验点选取了,所有与之相连的器材点也都要选取,那么就是一个最大权闭合子图的模型。
最大权闭合子图可以转化为求最小割,建图方法为:建立超级源S和超级汇T,对于每一个点i,如果点i的权值为正,那么建立一条从S到i的流量为其权值的边,如果点i的权值为负,那么建立一条从i到T费用为权值绝对值的边,原图中实验点->器材点的费用为正无穷。
因为最小割在数值上等于最大值,所以从S到T的最大流即为答案。
输出方案:求出最小割后,将图G分为了S和T两个集合,那么所有可以从S到达的实验点i就是方案中的点。
(P.S.我个人觉得这个方法有问题,如果做某个实验既不会获得额外的赞助资金也不会消耗资金,简言之就是既不亏钱也不赚钱,那么这个实验是应该做的,但是上述方法不能找到这个试验点,我能想到的解决方法是枚举T中的边删边,但是这样会T,索性就写上述算法,寄希望于强大的SpecialJudge)
code:
#include
#include
#include
#include
#include
#include
#include
#include