题目链接

  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太空飞行计划(最大权闭合图)的更多相关文章

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

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

  2. Cogs 727. [网络流24题] 太空飞行计划(最大权闭合子图)

    [网络流24题] 太空飞行计划 ★★☆ 输入文件:shuttle.in 输出文件:shuttle.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] W 教授正在为国家航天中心计 ...

  3. luogu P2762 太空飞行计划问题

    好像是最大权闭合图,也就是最大流最小割啦,找出最大流的路径输出,这题如何建模呢,一样的先设源点和汇点,源点向每个计划连capacity为赞助数的边,每个计划连相应装置capacity为无穷的边,每个装 ...

  4. 【luogu P2762 太空飞行计划问题】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2762 算是拍照那个题的加强下. 输入真的很毒瘤.(都这么说但好像我的过了?) #include <qu ...

  5. 洛谷 P2762 太空飞行计划问题 P3410 拍照【最大权闭合子图】题解+代码

    洛谷 P2762 太空飞行计划问题 P3410 拍照[最大权闭合子图]题解+代码 最大权闭合子图 定义: 如果对于一个点集合,其中任何一个点都不能到达此集合以外的点,这就叫做闭合子图.每个点都有一个权 ...

  6. 网络流24题:P2762 太空飞行计划问题

    P2762 太空飞行计划问题 题目背景 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,E ...

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

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

  8. 洛谷 P4174 [NOI2006]最大获利 && 洛谷 P2762 太空飞行计划问题 (最大权闭合子图 && 最小割输出任意一组方案)

    https://www.luogu.org/problemnew/show/P4174 最大权闭合子图的模板 每个通讯站建一个点,点权为-Pi:每个用户建一个点,点权为Ci,分别向Ai和Bi对应的点连 ...

  9. 洛谷P2762 太空飞行计划问题(最大权闭合图)

    题意 有$m$个实验,$n$中器材,每个实验需要使用一些器材 每个实验有收入,每个器材有花费 最大化收入 - 花费 Sol 最大权闭合图的经典应用 从$S$向每个实验连流量为该实验收入的边 从每个器材 ...

随机推荐

  1. Android Theme.Dialog 到光 AppCompatDialog

    我用在我的 style.xml 作为主要应用程序主题 <style name="AppTheme" parent="Theme.AppCompat.Light&qu ...

  2. spark基准测试-BigDataBenchs

    https://blog.csdn.net/haoxiaoyan/article/details/53895068

  3. mysql IF语句使用

    类似于三元运算符 1)  IF(where,result1,result2) = where?result1:result2 例如 SELECT IF(1=1,1,2)    =>  1 2)  ...

  4. codevs 3344 迷宫

    时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题目描述 Description 小刚在迷宫内,他需要从A点出发,按顺序经过B,C,D……,到达最后一个点,再回到A ...

  5. rhythmbox插件开发笔记2:背景知识学习 D-Bus&VFS&Gio& Python GTK+ 3

    这次主要简单介绍下相关的背景知识 D-Bus&VFS&Gio& Python GTK+ 3  D-Bus D-Bus是开源的进程通信(IPC)系统,它允许多个进程进行实时通信. ...

  6. VS打包软件部署------ClickOnce应用安装 (各版本.net引导文件安装,再发布文档离线安装下载地址)

    一.1.其他引导程序包:地址  https://msdn.microsoft.com/zh-cn/vstudio/bb898654.aspx 2.离线安装各版本.net下载版(各种语言):https: ...

  7. Java8新特性Lambda表达式

    List<RoleDO> allRoles = roleService.list(); //获取角色中备注不是app的集合List<RoleDO> webRoles = all ...

  8. glove 安装错误

    https://stackoverflow.com/questions/44921611/error-installing-glove-python-link-exe-failed-with-exit ...

  9. jQuery实现滚动条下拉时无限加载

    var lastId=0;//记录每一次加载时的最后一条记录id,跟您的排序方式有关. var isloading = false; $(window).bind("scroll" ...

  10. python常用内置函数用法精要

    用一个表格大致总结一下所有的内置函数用法,如下: 函数 功能简要说明 abs(x) 返回数字x的绝对值或复数x的模 all(iterable) 如果对于可迭代对象中所有元素x都等价于True,则返回T ...