问题描述:
W 教授正在为国家航天中心计划一系列的太空飞行。每次太空飞行可进行一系列商业
性实验而获取利润。现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这
些实验需要使用的全部仪器的集合I={I1,I2,…In}。实验Ej需要用到的仪器是I的子集RjÍI。
配置仪器Ik的费用为ck美元。实验Ej的赞助商已同意为该实验结果支付pj美元。W教授的
任务是找出一个有效算法,确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才
能使太空飞行的净收益最大。这里净收益是指进行实验所获得的全部收入与配置仪器的全部
费用的差额。

这道题的建模方法是这样的:
首先是超级源点连到每个实验,边权为实验赚的钱
然后所有的仪器连向超级汇点,边权为花费
此外,每个实验和这个实验需要的仪器连一条无限大的边。然后求最大流。
为什么这样做就可以呢?一开始我想到使用负权,但是我们换个思路考虑,我们算出来最少花费的钱,其实也就是最小割,那么问题就好解决了。其实这个问题属于最大权闭合图。

还没有实现输出路径,以后再试下

#include <iostream>
#include <cstdio>
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100010;//点数的最大值
const int MAXM = 400010;//边数的最大值
const int INF = 0x3f3f3f3f;
struct Edge
{int to,next,cap,flow;int from;
} edge[MAXM]; //注意是MAXM
int n,m;
int tol;
int head[MAXN];
int gap[MAXN],dep[MAXN],cur[MAXN];
int vis[MAXN];
void init()
{tol = 0;memset(head,-1,sizeof(head));
}
void addedge(int u,int v,int w,int rw = 0)
{edge[tol].to = v;edge[tol].cap = w;edge[tol].flow = 0;edge[tol].from = u;edge[tol].next = head[u];head[u] = tol++;edge[tol].to = u;edge[tol].cap = rw;edge[tol].from = v;edge[tol].flow = 0;edge[tol].next = head[v];head[v] = tol++;
}
int Q[MAXN];
void BFS(int start,int end)
{memset(dep,-1,sizeof(dep));memset(gap,0,sizeof(gap));memset(vis,0,sizeof(vis));gap[0] = 1;int front = 0, rear = 0;dep[end] = 0;Q[rear++] = end;while(front != rear){int u = Q[front++];for(int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].to;if(dep[v] != -1)continue;Q[rear++] = v;dep[v] = dep[u] + 1;vis[v] = 1;gap[dep[v]]++;}}
}
int S[MAXN];
int sap(int start,int end,int N)
{BFS(start,end);memcpy(cur,head,sizeof(head));int top = 0;int u = start;int ans = 0;while(dep[start] < N){if(u == end){int Min = INF;int inser;for(int i = 0; i < top; i++)if(Min > edge[S[i]].cap - edge[S[i]].flow){Min = edge[S[i]].cap - edge[S[i]].flow;inser = i;}for(int i = 0; i < top; i++){edge[S[i]].flow += Min;edge[S[i]^1].flow -= Min;}ans += Min;top = inser;u = edge[S[top]^1].to;continue;}bool flag = false;int v;for(int i = cur[u]; i != -1; i = edge[i].next){v = edge[i].to;if(edge[i].cap - edge[i].flow && dep[v]+1 == dep[u]){flag = true;cur[u] = i;break;}}if(flag){S[top++] = cur[u];u = v;continue;}int Min = N;for(int i = head[u]; i != -1; i = edge[i].next)if(edge[i].cap - edge[i].flow && dep[edge[i].to] < Min){Min = dep[edge[i].to];cur[u] = i;}gap[dep[u]]--;if(!gap[dep[u]])return ans;dep[u] = Min + 1;gap[dep[u]]++;if(u != start)u = edge[S[--top]^1].to;}return ans;
}
void print_all_edge()
{for(int i = 0;i < tol ;i += 2){printf("%d -> %d cap: % d,flow: %d\n",edge[i].from,edge[i].to,edge[i].cap,edge[i].flow);}
}
inline bool getint(int &num)
{char in;bool IsN=false;in=getchar();if(in==EOF || in == '\n') return false;while(in!='-'&&(in<'0'||in>'9')) in=getchar();if(in=='-'){ IsN=true;num=0;}else num=in-'0';while(in=getchar(),in>='0'&&in<='9'){num*=10,num+=in-'0';}if(IsN) num=-num;if(in == '\n') return false;return true;
}
int main()
{while(scanf("%d%d",&m,&n) != EOF){init();int tot = 0;int st = 0, en = n+m+2;getchar();for(int i = 1;i<=m;i++){int cost;getint(cost);tot += cost;addedge(st,i,cost);int k;while(getint(k)){addedge(i,k+m,INF);}addedge(i,k+m,INF);}for(int i = 1;i<=n;i++){int cost;scanf("%d",&cost);addedge(i + m,en,cost);}int ans = sap(st,en,2*n + 2*m +2);printf("%d\n",tot - ans);}return 0;
}

网络流24题之太空飞行计划问题相关推荐

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

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

  2. 题解 【网络流24题】太空飞行计划

    [网络流24题]太空飞行计划 Description W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,- ...

  3. LOJ6001 - 「网络流 24 题」太空飞行计划

    原题链接 Description 有m(m≤50)个实验和n(n≤50)个仪器,做实验有报酬买仪器有花费.每个实验都需要一些仪器,求最大净收益(实验报酬−仪器花费),并输出一组方案. Solution ...

  4. [网络流24题] No2_太空飞行计划

    727. [网络流24题] 太空飞行计划 ★★☆   输入文件:shuttle.in   输出文件:shuttle.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] W ...

  5. 网络流24题之太空飞行计划——最大权闭合子图

    题目链接:太空飞行计划 [网络流24题] 太空飞行计划 ★★☆ 输入文件:shuttle.in 输出文件:shuttle.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] W ...

  6. 题解:线性规划与网络流24题 T2 太空飞行计划问题

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

  7. 网络流24题——2.太空飞行计划问题

    题目链接 https://www.luogu.org/problemnew/show/P2762 太空飞行计划 我们从S向所有实验连流量为收入的边(割这条边选择不做这个实验) 从所有的机器向T连边(割 ...

  8. 线性规划与网络流24题 2太空飞行计划问题 最大权闭合图问题(不懂) nefu 476

    太空飞行计划问题 Time Limit 1000ms Memory Limit 65536K description W教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而 ...

  9. 【网络流24题】太空飞行计划问题

    问题描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业 性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,-,Em},和进行这 些实验需要使用的全部仪 ...

  10. 「网络流 24 题」太空飞行计划

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

最新文章

  1. 光学传输与摄像头光学技术
  2. LeetCode实战:将有序数组转换为二叉搜索树
  3. Docker中的execdriver架构
  4. msys2 config.guess: unable to guess system type
  5. UnityShader RenderTypeQueue 渲染顺序
  6. Flask-SQLALchemy 连接数据库
  7. Spring Boot拦截器(WebMvcConfigurerAdapter)
  8. 注解的DI以及动态代理
  9. Linux学习笔记(五):less|more的命令使用
  10. 2018年英语计算机职称考试,2018年高级职称计算机考试内容介绍
  11. 使用Python实现excel项目清单自动生成word文档
  12. 卸载wps后,安装office,图标关联失败
  13. 解决scala 2.10.X 无法导入 actors的问题
  14. Hadoop生态系统全面介绍
  15. 《文明3》全攻略之设置篇
  16. Redis安全注意事项
  17. Python基础知识-pycharm版-对象
  18. bzoj4399 魔法少女LJJ
  19. Java随笔——逻辑运算符和(|和||)之间的区别
  20. 开源,选择Google Code还是Sourceforge【转】

热门文章

  1. 教你用scratch2.0编见缝插针游戏
  2. 在一台服务器安装多个MySQL数据库实例
  3. 【微信群助手】微信社群怎么运营?微信群规则范本
  4. 致敬图灵,数说人工智能的前世今生
  5. python如何安装pil库_Python安装PIL库
  6. 外卖点餐系统部分模块设计
  7. 决策树(基础理论篇)
  8. python和es6_JavaScript-ES6总结(更新中!!!)
  9. hiho#1082 然而沼跃鱼早就看穿了一切
  10. Gmapping Dropped 100.00% of messages so far 解决办法