Description
W教授正在为国家航天中心计划一系列的太空飞行。每次太空飞行可进行一系列商业性实验而获取利润。现已确定了一个可供选择的实验集合 E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的集合 I={I1,I2,…In}。实验 Ej需要用到的仪器是 I的子集。配置仪器 Ik的费用为 ck美元。实验 Ej的赞助商已同意为该实验结果支付 pj美元。W教授的任务是找出一个有效算法,确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才能使太空飞行的净收益最大。这里净收益是指进行实验所获得的全部收入与配置仪器的全部费用的差额。
对于给定的实验和仪器配置情况,编程找出净收益最大的试验计划。
Input
文件第 1行有 2个正整数 m和 n。m是实验数,n是仪器数。
接下来的 m行,每行是一个实验的有关数据。第一个数赞助商同意支付该实验的费用;接着是该实验需要用到的若干仪器的编号。
最后一行的 n个数是配置每个仪器的费用。
Output
程序运行结束时,将最佳实验方案输出。第 1行是实验编号;第 2行是仪器编号;最后一行是净收益。
Sample Input
2 3
10 1 2
25 2 3
5 6 7
Sample Output
1 2
1 2 3
17
HINT
n,m < 50
题解
网络流最大流
首先是建图,将原点到每个实验一次连接一条容量为该实验可以收获的费用的边,将每个仪器到汇点连接一条容量为该仪器所需要的费用的边,从每个实验到其所需要的仪器连接一条容量为inf的边。
图建好之后,求一遍最大流,净收益=所有的实验收入总和-最大流。
code
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 3010
#define inf 0x7fffffff
using namespace std;
struct node
{
int next,to,s;
};
node Edge[N<<1];
int n,m,tot=