题目描述

W 教授正在为国家航天中心计划一系列的太空飞行。每次太空飞行可进行一系列商业性实验而获取利润。现已确定了一个可供选择的实验集合 \(E = \{ E_1, E_2, \cdots, E_m \}\) ,和进行这些实验需要使用的全部仪器的集合 \(I = \{ I_1, I_2, \cdots, I_n \}\) 。实验 \(E_j\)​​ 需要用到的仪器是 \(I\) 的子集 \(R_j \subseteq I\) 。

配置仪器 \(I_k\)k​​ 的费用为 \(c_k\)​​ 美元。实验 \(E_j\) 的赞助商已同意为该实验结果支付 \(p_j\) 美元。W 教授的任务是找出一个有效算法,确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才能使太空飞行的净收益最大。这里净收益是指进行实验所获得的全部收入与配置仪器的全部费用的差额。

对于给定的实验和仪器配置情况,编程找出净收益最大的试验计划。

输入格式

第 \(1\) 行有 \(2\) 个正整数 \(m\) 和 \(n\) 。\(m\) 是实验数,\(n\) 是仪器数。接下来的 \(m\) 行,每行是一个实验的有关数据。第一个数赞助商同意支付该实验的费用;接着是该实验需要用到的若干仪器的编号。最后一行的 \(n\) 个数是配置每个仪器的费用。

输出格式

第 \(1\) 行是实验编号,第 \(2\) 行是仪器编号,最后一行是净收益。

样例

样例输入

2 3
10 1 2
25 2 3
5 6 7

样例输出

1 2
1 2 3
17

数据范围与提示

\(1 \leq n, m \leq 50\)

题解

最大权闭合图问题

将源点与实验相连,容量为利益,器材与汇点相连,容量为负的费用

实验与器材连 \(inf\) 的边,代表如果要做这个实验,就必须要有器材

然后跑最小割,用开始的利益和减去代价就是答案

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXN=100+10,MAXM=10200+10,inf=0x3f3f3f3f;
int n,m,s,t,beg[MAXN],cur[MAXN],vis[MAXN],clk,level[MAXN],nex[MAXM<<1],to[MAXM<<1],cap[MAXM<<1],ans,e=1,all;
std::queue<int> q;
template<typename T> inline bool read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
if(ch!=' ')return true;
else return false;
}
template<typename T> inline void write(T x,char ch='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline void insert(int x,int y,int z)
{
to[++e]=y;
nex[e]=beg[x];
beg[x]=e;
cap[e]=z;
to[++e]=x;
nex[e]=beg[y];
beg[y]=e;
cap[e]=0;
}
inline bool bfs()
{
memset(level,0,sizeof(level));
level[s]=1;
q.push(s);
while(!q.empty())
{
int x=q.front();
q.pop();
for(register int i=beg[x];i;i=nex[i])
if(cap[i]&&!level[to[i]])level[to[i]]=level[x]+1,q.push(to[i]);
}
return level[t];
}
inline int dfs(int x,int maxflow)
{
if(x==t||!maxflow)return maxflow;
int res=0;
vis[x]=clk;
for(register int &i=cur[x];i;i=nex[i])
if((vis[to[i]]^vis[x])&&cap[i]&&level[to[i]]==level[x]+1)
{
int f=dfs(to[i],min(maxflow,cap[i]));
res+=f;
cap[i]-=f;
cap[i^1]+=f;
maxflow-=f;
if(!maxflow)break;
}
vis[x]=0;
return res;
}
inline int Dinic()
{
int res=0;
while(bfs())clk++,memcpy(cur,beg,sizeof(cur)),res+=dfs(s,inf);
return res;
}
inline void BFS()
{
q.push(s);
vis[s]=1;
while(!q.empty())
{
int x=q.front();
q.pop();
for(register int i=beg[x];i;i=nex[i])
if(cap[i]&&!vis[to[i]])vis[to[i]]=1,q.push(to[i]);
}
}
int main()
{
read(n);read(m);
s=n+m+1,t=s+1;
for(register int i=1;i<=n;++i)
{
int x;read(x);insert(s,i,x);all+=x;
while(!read(x))insert(i,x+n,inf);
insert(i,x+n,inf);
}
for(register int i=1,x;i<=m;++i)read(x),insert(i+n,t,x);
ans=Dinic();
BFS();
for(register int i=1;i<=n;++i)
if(vis[i])write(i,' ');
puts("");
for(register int i=1;i<=m;++i)
if(vis[i+n])write(i,' ');
puts("");
write(all-ans,'\n');
return 0;
}

【刷题】LOJ 6001 「网络流 24 题」太空飞行计划的更多相关文章

  1. 【刷题】LOJ 6227 「网络流 24 题」最长k可重线段集问题

    题目描述 给定平面 \(\text{xoy}\) 上 \(n\) 个开线段组成的集合 \(\text{I}\) ,和一个正整数 \(k\) ,试设计一个算法. 从开线段集合 \(\text{I}\) ...

  2. LibreOJ #6001. 「网络流 24 题」太空飞行计划 最大权闭合图

    #6001. 「网络流 24 题」太空飞行计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测 ...

  3. Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流)

    Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流) Description W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行 ...

  4. [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划

    [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划 试题描述 一个餐厅在相继的 \(N\) 天里,第 \(i\) 天需要 \(R_i\) 块餐巾 \((i=l,2,-,N)\) ...

  5. [LOJ#6002]「网络流 24 题」最小路径覆盖

    [LOJ#6002]「网络流 24 题」最小路径覆盖 试题描述 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交)的集合.如果 V 中每个顶点恰好在 P 的一条路上,则称 P 是  ...

  6. loj #6014. 「网络流 24 题」最长 k 可重区间集

    #6014. 「网络流 24 题」最长 k 可重区间集 题目描述 给定实直线 L LL 上 n nn 个开区间组成的集合 I II,和一个正整数 k kk,试设计一个算法,从开区间集合 I II 中选 ...

  7. loj #6013. 「网络流 24 题」负载平衡

    #6013. 「网络流 24 题」负载平衡 题目描述 G 公司有 n nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n nn 个仓库的库存数量相同.搬运货物时 ...

  8. loj #6122. 「网络流 24 题」航空路线问题

    #6122. 「网络流 24 题」航空路线问题 题目描述 给定一张航空图,图中顶点代表城市,边代表两个城市间的直通航线.现要求找出一条满足下述限制条件的且途经城市最多的旅行路线. 从最西端城市出发,单 ...

  9. loj #6121. 「网络流 24 题」孤岛营救问题

    #6121. 「网络流 24 题」孤岛营救问题   题目描述 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂, ...

随机推荐

  1. VBA 连接,提醒 rs AS new adodb.recordset 的变量未定义

    解决方法: 菜单-工程-引用Microsoft ActiveX Data Objects 2.x Library 定位……msado15.dll

  2. 详解大数据采集引擎之Sqoop&采集oracle数据库中的数据

    一.Sqoop的简介: Sqoop是一个数据采集引擎/数据交换引擎,采集关系型数据库(RDBMS)中的数据,主要用于在RDBMS与HDFS/Hive/HBase之间进行数据传递,可以通过sqoop i ...

  3. 【css】文本超出行数以省略号显示

    //超出2行省略overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;-webk ...

  4. c# update check

    public class UpdateChecker { public static event EventHandler completeCheck; private static bool isC ...

  5. 20155216 Exp4 恶意代码分析

    20155216 Exp4 恶意代码分析 实践内容 使用schtasks指令监控系统运行 先在C盘目录下建立一个netstatlog.bat文件和netstatlog.txt文件,将记录的联网结果格式 ...

  6. 小程序echarts数据不改变,或者是一次渲染成功,第二次进入,渲染失败的解决办法

    1.引入echarts插件: import * as echarts from '../../ec-canvas/echarts'; 2.data中定义: ecBar: { onInit: initC ...

  7. 委托、多播委托(MulticastDelegate)

    委托.多播委托(MulticastDelegate) 多播委托(MulticastDelegate)继承自 Delegate ,表示多路广播委托:即,其调用列表中可以拥有多个元素的委托.实际上,我们自 ...

  8. Shiro安全框架学习笔记

    一.Shiro框架简单介绍 Apache Shiro是Java的一个安全框架,旨在简化身份验证和授权.Shiro在JavaSE和JavaEE项目中都可以使用.它主要用来处理身份认证,授权,企业会话管理 ...

  9. Scrapyd+Gerapy部署Scrapy爬虫进行可视化管理

    Scrapy是一个流行的爬虫框架,利用Scrapyd,可以将其部署在远程服务端运行,并通过命令对爬虫进行管理,而Gerapy为我们提供了精美的UI,可以在web页面上直接点击操作,管理部署在scrap ...

  10. dokuwiki工具栏添加换行回车快捷键与按钮

    需求 dokuwiki的语法要求以 \\ 为换行符(\\后面必须有1个空格).编辑器有快捷键.快捷键说明如下.https://www.dokuwiki.org/start?id=zh-tw:acces ...