[网络流24题] 太空飞行计划问题 (最大流->最大权闭合图)
做这道题之前建议先看这篇论文,虽然论文里很多地方用了很多术语,但hbt神犇讲得很明白
这篇题解更加偏向于感性理解
把问题放到二分图上,左侧一列点是实验,权值为$p[i]$,右侧一列点是仪器,权值为$c[i]$,左侧向右侧连接了许多条出边
如果想获得$p[i]$,需要保证i的所有出边都被选上了
按照论文里最大权闭合图的做法,实验和源点$s$相连,流量为$p[i]$,仪器和汇点$t$相连,流量为$c[i]$,实验和仪器之间的边流量为$inf$
最终的答案就是实验带来的报酬总和-这个图的最大流,即报酬总和去掉 报酬填补费用的总和 ,就是净收益
我们如何比较感性地理解它呢
求最大流的过程,可以看成用实验的钱消去仪器的钱的过程
而有一些实验可能先被遍历到,而这次实验的报酬小于所需仪器的总花费,即这次实验有点亏,但买了给其他实验用的仪器,而其他实验可以把这些钱补回来
在图上的体现就是,有其他实验的流量沿着反向边流向了这次实验
通过求最小割,我们把图分割成了两块,一块包含源点,一块包含汇点
源点指向的每个联通块中,都至少存在一个点,源点向它的流量$>0$,那么这个联通块里的实验仪器组合才是获利的
那么最终答案就是总获利-最大流,方案就是再进行一次$bfs$,$dep$有值的点,即和源点在同一联通块里的点。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N1 350
#define M1 3010
#define ll long long
#define dd double
#define inf 0x3f3f3f3f
using namespace std; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
} int n,m,nm,S,T;
int p[N1],c[N1];
struct Edge{
int head[N1],to[M1<<],nxt[M1<<],flow[M1<<],cte;
void ae(int u,int v,int F)
{
cte++; to[cte]=v; flow[cte]=F;
nxt[cte]=head[u]; head[u]=cte;
}
}e; int que[M1],hd,tl,dep[N1],cur[N1];
int bfs(Edge &E)
{
int x,j,v;
memset(dep,-,sizeof(dep)); memcpy(cur,E.head,sizeof(cur));
hd=,tl=; que[++tl]=S; dep[S]=;
while(hd<=tl)
{
x=que[hd++];
for(j=E.head[x];j;j=E.nxt[j])
{
v=E.to[j]; if(dep[v]!=-||!E.flow[j]) continue;
dep[v]=dep[x]+; que[++tl]=v;
}
}
return dep[T]!=-;
}
int dfs(Edge &E,int x,int limit)
{
int j,v,flow,ans=; if(x==T||!limit) return limit;
for(j=cur[x];j;j=E.nxt[j])
{
cur[x]=j; v=E.to[j];
if( dep[v]==dep[x]+ && (flow=dfs(E,v,min(E.flow[j],limit))) )
{
limit-=flow; ans+=flow;
E.flow[j]-=flow; E.flow[j^]+=flow;
if(!limit) break;
}
}
return ans;
}
int use[N1],de;
void Dinic()
{
int mxflow=,x,j,v,i,flag,sum=;
for(i=;i<=m;i++) sum+=p[i];
while(bfs(e)) mxflow+=dfs(e,S,inf);
bfs(e);
for(i=;i<=m;i++) if(dep[i]!=-) printf("%d ",i); puts("");
for(i=m+;i<=m+n;i++) if(dep[i]!=-) printf("%d ",i-m); puts("");
printf("%d\n",sum-mxflow);
} char str[];
int main()
{
scanf("%d%d",&m,&n);
int i,j,x,y,flag,slen; S=m+n+,T=m+n+; e.cte=;
for(i=,slen=;i<=m;i++)
{
p[i]=gint(); e.ae(S,i,p[i]), e.ae(i,S,);
memset(str,,sizeof(str)); cin.getline(str,); slen=;
while(sscanf(str+slen,"%d",&x)==)
{
e.ae(i,x+m,inf); e.ae(x+m,i,);
if(!x) slen++;
else{ while(x) x/=,slen++;}
slen++;
}
}
for(i=m+;i<=m+n;i++) c[i]=gint(), e.ae(i,T,c[i]), e.ae(T,i,);
Dinic();
return ;
}
[网络流24题] 太空飞行计划问题 (最大流->最大权闭合图)的更多相关文章
- Cogs 727. [网络流24题] 太空飞行计划(最大权闭合子图)
[网络流24题] 太空飞行计划 ★★☆ 输入文件:shuttle.in 输出文件:shuttle.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] W 教授正在为国家航天中心计 ...
- COGS727 [网络流24题] 太空飞行计划
[问题描述] W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪 ...
- [网络流24题] 太空飞行计划(cogs 727)
[问题描述] W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,-,Em},和进行这些实验需要使用的全部仪 ...
- P2762 [网络流24题]太空飞行计划问题(最小割)
地址 最大权闭合子图裸题,不说了吧,求方案就是把s集遍历一遍. 错误记录:dfs那块忘判断残量了,11分×1. #include<cstdio> #include<iostream& ...
- LibreOJ #6008. 「网络流 24 题」餐巾计划 最小费用最大流 建图
#6008. 「网络流 24 题」餐巾计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流)
Libre 6008 「网络流 24 题」餐巾计划 (网络流,最小费用最大流) Description 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,-,N).餐厅可以从三种途径获得餐巾. ...
- LOJ #6008. 「网络流 24 题」餐巾计划
#6008. 「网络流 24 题」餐巾计划 题目描述 一个餐厅在相继的 n nn 天里,每天需用的餐巾数不尽相同.假设第 i ii 天需要 ri r_iri 块餐巾.餐厅可以购买新的餐巾,每块餐 ...
- [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划
[luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划 试题描述 一个餐厅在相继的 \(N\) 天里,第 \(i\) 天需要 \(R_i\) 块餐巾 \((i=l,2,-,N)\) ...
- 【hjmmm网络流24题补全计划】
本文食用方式 按ABC--分层叙述思路 可以看完一步有思路后自行思考 飞行员配对问题 题目链接 这可能是24题里最水的一道吧... 很显然分成两个集合 左外籍飞行员 右皇家飞行员 跑二分图最大匹配 输 ...
随机推荐
- plsql developer ini
plsql developer ini [Colors] GradientEnabled=True VerticalGradient=True DefaultGradient=True Gradien ...
- ListViewItem中的图片不能动态改变的解决方法
近期遇到了一个问题,就是我的listviewitem中有个图片,点击的时候须要变成还有一种图片.结果在getView()中设置了响应.可是能够运行.就是不起作用.在网上查了非常多资料也没有解决.最后发 ...
- swift 声明特性 类型特性
原文地址:http://www.cocoachina.com/newbie/basic/2014/0612/8801.html 特性提供了关于声明和类型的很多其它信息.在Swift中有两类特性,用于修 ...
- Aizu/Aoj 0033 Ball
题目大意: 有编号1到10共10个球,从上方丢下去,入口处可以选择进入左边或者右边,最后10个球全部落下去后如果左右两侧都是从小到大的顺序,则输出YES:否则输出NO. 题目原本的标签枚举,复杂度是2 ...
- 读取url中某个值
url="http://test.plus.1course.cn/Task/Display?id=25942" print(url) result=url.split('/')[- ...
- 【HDOJ 1009】 CRB and String
[HDOJ 1009] CRB and String 每组两个串s t 仅仅由小写字母组成 问从s能不能变成t 改变的操作为选一个字符 在后面加上一个与所选字符不同的字符 这样的操作能够做无数次 问能 ...
- 计算工作日之后N天的日期
1.假期实体类: package com.smics.date; import java.io.Serializable; import java.util.Date; public class Va ...
- ubuntu修改capslock键,单独使用为esc,组合使用时为ctrl+
一.下面这部分可以将capslock与ctrl互换 将下面的代码放入-/.Xmodmap中, remove Lock = Caps_Lock remove Control = Control_L ke ...
- php错误抑制符
php错误抑制符 简介 PHP 支持一个错误控制运算符:@.当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉. @这个符号在Java里面是注解符号. 实例 <?ph ...
- nyoj 21--三个水杯(隐式图bfs)
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识 ...