题目背景

题目描述

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

对于给定的实验和仪器配置情况,编程找出净收益最大的试验计划。

输入输出格式

输入格式:

第1行有2 个正整数m和n。m是实验数,n是仪器数。接下来的m 行,每行是一个实验的有关数据。第一个数赞助商同意支付该实验的费用;接着是该实验需要用到的若干仪器的编号。最后一行的n个数是配置每个仪器的费用。

输出格式:

第1 行是实验编号;第2行是仪器编号;最后一行是净收益。

输入输出样例

输入样例#1:

2 3
10 1 2
25 2 3
5 6 7
输出样例#1:

1 2
1 2 3
17 最大权闭合子图
挺裸的建模
这题目需要spj啊
所以不要去没spj的题库啊比如说codevs?
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = ;
const int INF = 0x7fffffff;
int n,m,S,T;
struct node{
int next,v,w;
}edge[maxn];
int dis[maxn];
int que[maxn],head[maxn];
int num=;
void add_edge(int u,int v,int w)
{
edge[++num].v=v;edge[num].w=w;edge[num].next=head[u];head[u]=num;
edge[++num].v=u;edge[num].w=; edge[num].next=head[v];head[v]=num;
}
bool bfs()
{
memset(dis,-,sizeof(dis));
int h=,t=;
que[h]=dis[]=;
while(h<t)
{
int u=que[h++];
if(h==maxn)h=;
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].v;
if(edge[i].w&&dis[v]<)
{
que[t++]=v;
dis[v]=dis[u]+;
if(t==maxn)t=;
}
}
}
if(dis[T]==-)return false;
return true;
}
int dfs(int x,int f)
{
if(x==T) return f;
int mn=,w;
for(int i=head[x];i;i=edge[i].next)
{
if(edge[i].w&&dis[edge[i].v]==dis[x]+)
{
w=f-mn;
w=dfs(edge[i].v,min(w,edge[i].w));
edge[i].w-=w;
edge[i^].w+=w;
mn+=w;
if(mn==f)return f;
}
}
if(!mn)dis[x]=-;
return mn;
}
int main(){
int sum=;
scanf("%d%d",&m,&n);S=,T=n+m+;
for(int a,i=;i<=m;++i)
{
bool flag=;
scanf("%d",&a);sum+=a;
add_edge(S,i,a);
while()
{
int x=;
char c=getchar();
while(c<''||c>'') c=getchar();
while(c<=''&&c>=''){x=x*+c-'',c=getchar();}
add_edge(i,x+m,INF);if(c==||c==)break;
}
}
for(int a,i=;i<=n;++i)
scanf("%d",&a),add_edge(m+i,T,a);
int ans=;
while(bfs())
ans+=dfs(S,INF);
for(int i=;i<=m;++i)
if(dis[i]!=-)printf("%d ",i);
puts("");
for(int i=m+;i<=T;i++)
if(dis[i]!=-)printf("%d ",i-m);
puts("");
printf("%d\n",sum-ans);
return ;
}

网络流24T 太空飞行计划问题的更多相关文章

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

    原题链接 Description 有个实验和个仪器,做实验有报酬买仪器有花费.每个实验都需要一些仪器,求最大净收益(实验报酬仪器花费),并输出一组方案. Solution 实验向所需仪器连边,实验的点 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. NYIST 531 太空飞行计划

    太空飞行计划 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述        W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利 ...

随机推荐

  1. 这五本Python急速入门必读的书,送给正在学习Python的你!

    书籍是人类进步的阶梯,这句话从古至今都是适用的.为什么会这么说呢?书籍,它记录了人们实践的经验,这些经验有助于我们快速的学习,对于编程学习来说也不例外,今天就给大家带来了以下的书籍干货,希望能够帮助到 ...

  2. CodeForce--Benches

    A. Benches   There are nn benches in the Berland Central park. It is known that aiai people are curr ...

  3. PHP-redis命令之 列表(lists)

    三.列表(lists) 1.lpush:将所有指定的值插入到存于 key 的列表的头部.如果 key 不存在,那么在进行 push 操作前会创建一个空列表. 如果 key 对应的值不是一个 list ...

  4. 如何用好 Google 等搜索引擎?

    看见知乎上如何用好Google搜索的问题(http://www.zhihu.com/question/20161362),整理一下.感谢知乎大神 1.Choose Which Google? HTTP ...

  5. multiprocessing join与lock区别

    加锁 join方法 join方法会造成阻塞,在上一个进程完成之前不会运行join()后面的代码 lock  仍会执行之后的代码,遇到创建进程,会发向操作系统发出指令,但不会执行,等到上锁的进程结束之后 ...

  6. Chromium Embedded Framework

    关于CEF 近期由于工作需要开始研究了Google的Chromium Embedded Framework(CEF),这是一个基于Google Chromium开源代码的项目,使用CEF可以很方便的在 ...

  7. loj2005 「SDOI2017」相关分析

    鬼畜线段树--Orz Capella #include <iostream> #include <cstdio> using namespace std; int n, m, ...

  8. Selenium WebDriver- 指定页面加载时间

    #encoding=utf-8 import unittest import time from selenium import webdriver from selenium.webdriver i ...

  9. Leetcode3--->无重复字符的最长子串长度

    题目:给定一个字符串string,找出string中无重复字符的最长子串. 举例: Given "abcabcbb", the answer is "abc", ...

  10. day01_10.for循环

    for和while都是一种循环 解释:所有循环的共同点 画图详解 在一条数轴上,循环就是有起始点($i=0); 有结束点($i<=10);有步长($i++); 每走一个相应的步长,就执行一次代码 ...