[Cogs727] [网络流24题#2] 太空飞行计划 [网络流,最小割]
建图:源点—(w[i])—>实验—(∞)—>仪器—(cost[i])—>汇点,
如果该实验造成收益,则仪器到汇点的边在最小割中,
如果该实验造成损失,则源点到实验的边在最小割中,
故答案就是所有实验的所有收益(不考虑仪器花费的)减去最小割。
特别注意,最后统计方案时,不能直接判断边权是否为0,因为当花费等于收益时,这种方法会将该实验计入答案而题目则不允许,故应该在最后Bfs出的level数组中判断是否可达,再通过实验把所需仪器统计出来。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <algorithm>
#include <queue>
#include <vector> using namespace std; template<const int _n>
struct Edge
{
struct Edge_base { int to,next,w; }e[_n];
int p[_n],cnt;
Edge() { clear(); }
inline int start(const int x) { return p[x]; }
inline void insert(const int x,const int y,const int z)
{ e[++cnt].to=y; e[cnt].next=p[x]; e[cnt].w=z; p[x]=cnt; return ; }
inline Edge_base& operator[](const int x) { return e[x]; }
inline void clear() { cnt=,memset(p,,sizeof(p)); }
}; int n,m,SSS,TTT;
int w[],cost[];
int level[],cur[];
char str[];
Edge<> e;
vector<pair<int,int> > vec; bool Bfs(const int S)
{
int i,t;
queue<int> Q;
memset(level,,sizeof(int)*(n+m+));
level[S]=;Q.push(S);
while(!Q.empty())
{
t=Q.front(),Q.pop();
for(i=e.start(t);i;i=e[i].next)
{
if(!level[e[i].to] && e[i].w)
{
level[e[i].to]=level[t]+;
Q.push(e[i].to);
}
}
}
return level[TTT];
} int Dfs(const int S,const int bk)
{
if(S==TTT)return bk;
int rest=bk;
for(int &i=cur[S];i;i=e[i].next)
{
if(level[e[i].to]==level[S]+ && e[i].w)
{
int flow=Dfs(e[i].to,min(rest,e[i].w));
e[i].w-=flow;
e[i^].w+=flow;
if((rest-=flow)<=)break;
}
} if(rest==bk)level[S]=;
return bk-rest;
} int Dinic()
{
int i,j,flow=;
int Ans[]={};
while(Bfs(SSS))
{
memcpy(cur,e.p,sizeof(int)*(n+m+));
flow+=Dfs(SSS,0x3f3f3f3f);
} for(i=;i<=n;++i)
{
if(level[i])
{
printf("%d ",i);
for(j=e.start(i);j;j=e[j].next)
Ans[e[j].to-n]=;
}
}
printf("\n");
for(i=;i<=m;++i)
{
if(Ans[i])printf("%d ",i);
}
printf("\n"); return flow;
} void Build()
{
int i;
SSS=n+m+,TTT=n+m+;
for(i=;i<=n;++i)
{
e.insert(SSS,i,w[i]);
e.insert(i,SSS,);
}
for(i=;i<(int)vec.size();++i)
{
e.insert(vec[i].first,vec[i].second+n,0x3f3f3f3f);
e.insert(vec[i].second+n,vec[i].first,);
}
for(i=n+;i<=m+n;++i)
{
e.insert(i,TTT,cost[i-n]);
e.insert(TTT,i,);
}
return ;
} #define EOL -1
int getint(int& data,int & t)
{
char ch;data=;
ch=str[t++];
while((ch<'' || ch>'') && ch)ch=str[t++];
while(ch>='' && ch<='')data=data*+ch-,ch=str[t++];
if(!data)return EOL;
return ;
} int main()
{
freopen("shuttle.in","r",stdin);
freopen("shuttle.out","w",stdout); int i,c,Sum=; scanf("%d%d",&n,&m);
for(i=;i<=n;++i)
{
scanf("%d",&w[i]);
Sum+=w[i];
fgets(str,,stdin);
int t=;
while(~getint(c,t))
{
vec.push_back(make_pair(i,c));
if(t==-)break;
}
}
for(i=;i<=m;++i)
{
scanf("%d",&cost[i]);
} Build(); printf("%d\n",Sum-Dinic()); return ;
}
[Cogs727] [网络流24题#2] 太空飞行计划 [网络流,最小割]的更多相关文章
- LOJ6001 - 「网络流 24 题」太空飞行计划
原题链接 Description 有个实验和个仪器,做实验有报酬买仪器有花费.每个实验都需要一些仪器,求最大净收益(实验报酬仪器花费),并输出一组方案. Solution 实验向所需仪器连边,实验的点 ...
- LibreOJ #6001. 「网络流 24 题」太空飞行计划 最大权闭合图
#6001. 「网络流 24 题」太空飞行计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测 ...
- Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流)
Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流) Description W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行 ...
- 题解:线性规划与网络流24题 T2 太空飞行计划问题
太空飞行计划问题 问题描述 W教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,-,Em},和进行这些实验需要 ...
- 【刷题】LOJ 6001 「网络流 24 题」太空飞行计划
题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合 \(E = \{ E_1, E_2, \cdots, E_m ...
- LibreOJ #6001. 「网络流 24 题」太空飞行计划
\(\quad\) 与网络流有关的最值有三个:最大流,最小费用,最小割.这道题是最小割.想了好久,终于想明白最小割应该怎么用. \(\quad\) 先找出矛盾的事物.在这道题中,两件事是矛盾的:做实验 ...
- 【PowerOJ1737&网络流24题】太空飞行计划问题(最小割)
题意: 思路: #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned in ...
- P2762 太空飞行计划问题 (最小割)
题意:n个实验 每个实验可获利ai元 做每个实验需要几个仪器 购买每个仪器有不同的花费 不同实验可能会用到同一个仪器 只用购买一次 求最大收益 题解:......................... ...
- P2762 [网络流24题]太空飞行计划问题(最小割)
地址 最大权闭合子图裸题,不说了吧,求方案就是把s集遍历一遍. 错误记录:dfs那块忘判断残量了,11分×1. #include<cstdio> #include<iostream& ...
随机推荐
- PL/SQL程序控制结构及在PL/SQL中更改数据和管理事务
1.条件控制 A. IF条件分支语法: if (条件1) then 语句; elsif (条件2) then 语句; elsif (条件3) then 语句; else 语句; end if; B . ...
- 49.Ext.form.TextField()基本用法
转自:https://blog.csdn.net/toudoulin/article/details/6719163 var textfieldName = new Ext.form.TextFiel ...
- PCB genesis连孔加除毛刺孔(圆孔与槽孔)实现方法(二)
一.为什么 连孔加除毛刺孔 原因是 PCB板材中含有玻璃纤维, 毛刺产生位置在于2个孔相交位置,由于此处钻刀受力不均导致纤维切削不断形成毛刺 ,为了解决这个问题:在钻完2个连孔后,在相交处再钻一个孔, ...
- Akka源码分析-Actor创建(续)
在上一遍博客中,我们已经分析了actor创建的大致过程,但只是涉及到了Dipatcher/Mailbox/ActorCell/InternalActorRef等对象的创建,并没有介绍我们自定义的继承A ...
- linux top 的用法
本篇博文主要讲解有关top命令,top命令的主要功能是查看进程活动状态以及一些系统状况. TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终 ...
- $P5240 Derivation$
神仙题. 第一场月赛的题目我到第二场月赛完了才写[由此可见我是真的菜 题目就是个大模拟加乘显然,幂的话需要将原函数.导函数的函数值用扩展欧拉定理展开 \(log\) 层.时间复杂度 \(O(T |S| ...
- phonegap在eclipse上的安装
1.首先安装好eclipse 2.下载安装好sdk 3.下载安装好adt 4.在这个地方下载好phonegap的包,https://codeload.github.com/phonegap/phone ...
- Unity学习-软件的基本操作(二)
基本操作 1:Scene中 以小手显示,平移画布,与鼠标中键一样 2:平移 游戏对象,组件的 Position属性 也可设置 3:旋转 游戏对象,组件的 Rotation属性 也可设置 4:缩放 游戏 ...
- (转)Vue 爬坑之路(三)—— 使用 vue-router 跳转页面
使用 Vue.js 做项目的时候,一个页面是由多个组件构成的,所以在跳转页面的时候,并不适合用传统的 href,于是 vue-router 应运而生. 官方文档: https://router.vue ...
- JS——sort
1.a-b升序 <script> var arr = [2, 3, 1, 5, 0]; function compare(a, b) { return a - b; } console.l ...