【Luogu】P2762太空飞行计划(最大权闭合图)
woc这题目的输入格式和输出格式真的恶心
首先我们就着样例讲一下闭合图

如图所示,第一层是两个实验节点,带来正收益;第二层是三个仪器节点,带来负收益;问讲道理到终点可以获得多大收益。
闭合图是什么呢?闭合图是一个点集,这个点集中所有点的出边所指向的点都必须在闭合图中。我们用点权来表示点的话,比如点集{10,-5,-6,终点}就是个闭合图,然而{10,25}就不是。
然后这题显而易见的叫我们求出最大权闭合图。
于是我们可以把它变成这样一个图:

如图,从源点到每个正点权点连一条容量为点权的边,从正点权点向负点权点连一条容量为INF的边,再从负点权点向汇点连一条容量是该点点权绝对值的边。
这样原来的求最大权闭合图变成求这个图的最小割。证明在这边
这样就完啦
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<queue>
#define maxn 1000
#define maxm 1000
using namespace std; inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} inline int count(int i){ return i&?i+:i-; } struct Edge{
int next,to,val;
}edge[maxm*];
int head[maxn*],num;
inline void addedge(int from,int to,int val){
edge[++num]=(Edge){head[from],to,val};
head[from]=num;
}
inline void add(int from,int to,int val){
addedge(from,to,val);
addedge(to,from,);
} bool vis[maxn*];
int dfn[maxn];
int dis[maxn];
bool ext[maxn];
int list[maxn];
int Start,End;
bool bfs(){
memset(vis,,sizeof(vis));
memset(dis,,sizeof(dis));
queue<int>f;
f.push(Start);vis[Start]=;dfn[Start]=;
while(!f.empty()){
int from=f.front();f.pop();
for(int i=head[from];i;i=edge[i].next){
int to=edge[i].to;
if(edge[i].val<=||vis[to]) continue;
dfn[to]=dfn[from]+; vis[to]=; dis[to]=dis[from]+;
f.push(to);
}
}
return vis[End];
} int dfs(int x,int val){
//printf("%d\n",x);
if(x==End||val==) return val;
int flow=;vis[x]=;
for(int &i=list[x];i;i=edge[i].next){
int to=edge[i].to;
if(edge[i].val<=||dfn[to]!=dfn[x]+||vis[to]) continue;
int now=dfs(to,min(val,edge[i].val));
edge[i].val-=now;edge[count(i)].val+=now;flow+=now;val-=now;
if(val<=) break;
}
if(val!=flow) dfn[x]=-;
return flow;
} int maxflow(){
int ans=;
while(bfs()){
memset(vis,,sizeof(vis));
for(int i=;i<=End;++i) list[i]=head[i];
int now=dfs(Start,0x7fffffff);
if(!now) break;
ans+=now;
}
return ans;
} int cnt;
bool mst[maxn+maxm+];
int c[maxn][maxm];
int tot[maxm]; int main(){
int m=read(),n=read();End=n+m+;
string S;
for(int i=;i<=m;++i){
int x=read();
cnt+=x;
add(Start,i,x);
getline(cin,S);
int len=S.length();
for(int j=;j<len;++j){
if(S[j]==' ') continue;
x=;
while(isdigit(S[j])){
x=x*+S[j]-'';
j++;
}
c[i][++tot[i]]=x;
}
for(int j=;j<=tot[i];++j) add(i,c[i][j]+m,0x7fffffff);
}
for(int i=;i<=n;++i){
int x=read();
add(i+m,End,x);
}
int ans=maxflow();
for(int i=;i<=m;++i)
if(dis[i]^) printf("%d ",i);
printf("\n");
for(int i=;i<=n;++i)
if(dis[i+m]^) printf("%d ",i);
printf("\n%d",cnt-ans);
return ;
}
【Luogu】P2762太空飞行计划(最大权闭合图)的更多相关文章
- LibreOJ #6001. 「网络流 24 题」太空飞行计划 最大权闭合图
#6001. 「网络流 24 题」太空飞行计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测 ...
- Cogs 727. [网络流24题] 太空飞行计划(最大权闭合子图)
[网络流24题] 太空飞行计划 ★★☆ 输入文件:shuttle.in 输出文件:shuttle.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] W 教授正在为国家航天中心计 ...
- luogu P2762 太空飞行计划问题
好像是最大权闭合图,也就是最大流最小割啦,找出最大流的路径输出,这题如何建模呢,一样的先设源点和汇点,源点向每个计划连capacity为赞助数的边,每个计划连相应装置capacity为无穷的边,每个装 ...
- 【luogu P2762 太空飞行计划问题】 题解
题目链接:https://www.luogu.org/problemnew/show/P2762 算是拍照那个题的加强下. 输入真的很毒瘤.(都这么说但好像我的过了?) #include <qu ...
- 洛谷 P2762 太空飞行计划问题 P3410 拍照【最大权闭合子图】题解+代码
洛谷 P2762 太空飞行计划问题 P3410 拍照[最大权闭合子图]题解+代码 最大权闭合子图 定义: 如果对于一个点集合,其中任何一个点都不能到达此集合以外的点,这就叫做闭合子图.每个点都有一个权 ...
- 网络流24题:P2762 太空飞行计划问题
P2762 太空飞行计划问题 题目背景 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,E ...
- Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流)
Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流) Description W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行 ...
- 洛谷 P4174 [NOI2006]最大获利 && 洛谷 P2762 太空飞行计划问题 (最大权闭合子图 && 最小割输出任意一组方案)
https://www.luogu.org/problemnew/show/P4174 最大权闭合子图的模板 每个通讯站建一个点,点权为-Pi:每个用户建一个点,点权为Ci,分别向Ai和Bi对应的点连 ...
- 洛谷P2762 太空飞行计划问题(最大权闭合图)
题意 有$m$个实验,$n$中器材,每个实验需要使用一些器材 每个实验有收入,每个器材有花费 最大化收入 - 花费 Sol 最大权闭合图的经典应用 从$S$向每个实验连流量为该实验收入的边 从每个器材 ...
随机推荐
- 【笨办法学Python】习题11:打印出改变了的输入
print "How old are you?", age = raw_input() print "How tall are you?", height = ...
- IOS typedef 函数指针的用法
代码简化, 促进跨平台开发的目的. typedef 行为有点像 #define 宏,用其实际类型替代同义字. 不同点:typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换. 用 ...
- SQL 时间日期函数
1.获取当前日期GetDate getdate()函数以datetime数据类型的格式返回当前SQLServer服务器所在计算机的日期和时间.其语法格式为getdate().返回值舍入到最近的秒小数部 ...
- MySQL 导出一句话
听说是很老的东西了,学习的时候发现还是很好用的,故学习转载过来,留备学习. mysql 导出一句话 方法1:网上流行的方法 流程:(1)建表--->(2)插入数据--->(3)select ...
- Slacklining 2017/2/6
原文 Get ready for a different kind of challenge What happens when mountain climbers take a day off?Ap ...
- Servlet和JSP之有关Servlet和JSP的梳理(二)
JSP JSP页面本质上是一个Servlet,JSP页面在JSP容器中运行,一个Servlet容器通常也是JSP容器. 当一个JSP页面第一次被请求时,Servlet/JSP容器主要做一下两件事情: ...
- Heacher互助平台 α版本冲刺
课程属性 作业课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/ 作业链接 https://edu.cnblogs.co ...
- CPP-基础:char、BYTE、byte
一,C++语言的内建类型中没“BYTE”这么个类型.BYTE是WINDOWS Platform SDK中windef.h里面定义的:typedef unsigned char BYTE; 二,char ...
- MySQL 实时监控日志
简单的梳理一下为什么要写这边文章,主要是学了ORM之后,发现通过ORM插入数据真的很方便,但是通过ORM生成的SQL语句又是怎么写的呢,百思不得姐.于是就找到了这个办法 首先查看一下查看MySQL 日 ...
- cmake 指定输出目录
$ mkdir ~/cpp-netlib-build $ cd ~/cpp-netlib-build $ cmake -DCMAKE_BUILD_TYPE=Debug \ > -DCMAKE_C ...