原题:
        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 个数是配置每个仪器的费用。
 
input
2 3
10 1 2
25 2 3
5 6 7

output
1 2
1 2 3
17

 
 
【分析】
  就是一个裸的最大权闭合子图啦。
  但是输出方案让我很内伤。。。
  上一题是点数尽量少,这一题是尽量多。。。
  就是一些又不赚钱又不赔钱的也要算上。 
  但是跑最大流的话,会把他割掉,然后dfs方法就不行了,内伤、、、
  纠结了好久
  网上有人说那就枚举把。。。
 
  但是,我转念一想,不如猥琐一遍,,,然后我就放大边权,,,过了!!!!
 
 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define Maxn 110
#define INF 0xfffffff struct node
{
int x,y,f,o,next;
}t[Maxn*Maxn];int len;
int first[Maxn]; int mymin(int x,int y) {return x<y?x:y;} void ins(int x,int y,int f)
{
t[++len].x=x;t[len].y=y;t[len].f=f;
t[len].next=first[x];first[x]=len;t[len].o=len+;
t[++len].x=y;t[len].y=x;t[len].f=;
t[len].next=first[y];first[y]=len;t[len].o=len-;
} int c[Maxn]; int st,ed; queue<int > q;
int dis[Maxn];
bool bfs()
{
while(!q.empty()) q.pop();
memset(dis,-,sizeof(dis));
q.push(st);dis[st]=;
while(!q.empty())
{
int x=q.front();
for(int i=first[x];i;i=t[i].next) if(t[i].f>)
{
int y=t[i].y;
if(dis[y]==-)
{
dis[y]=dis[x]+;
q.push(y);
}
}
q.pop();
}
if(dis[ed]==-) return ;
return ;
} int ffind(int x,int flow)
{
if(x==ed) return flow;
int now=;
for(int i=first[x];i;i=t[i].next) if(t[i].f>)
{
int y=t[i].y;
if(dis[y]==dis[x]+)
{
int a=ffind(y,mymin(flow-now,t[i].f));
t[i].f-=a;
t[t[i].o].f+=a;
now+=a;
}
if(now==flow) break;
}
if(now==) dis[x]=-;
return now;
} int max_flow()
{
int ans=;
while(bfs())
{
ans+=ffind(st,INF);
}
return ans;
} bool qq[Maxn]; void dfs(int x)
{
qq[x]=;
for(int i=first[x];i;i=t[i].next) if(!qq[t[i].y]&&t[i].f>)
{
dfs(t[i].y);
}
} int main()
{
int m,n,sum=;
scanf("%d%d",&m,&n);
len=;
memset(first,,sizeof(first));
for(int i=;i<=m;i++)
{
scanf("%d",&c[i]);
sum+=c[i];
while()
{
int x;
scanf("%d",&x);
if(x==-) break;
ins(i,x+m,INF);
}
}
st=n+m+;ed=st+;
for(int i=;i<=m;i++) ins(st,i,c[i]*+);
for(int i=;i<=n;i++)
{
int x;
scanf("%d",&x);
ins(i+m,ed,x*);
}
int x=max_flow();
memset(qq,,sizeof(qq));
dfs(st);
/*for(int i=1;i<=len;i+=2)
{
if(t[i].x==st&&t[i].f>0) qq[t[i].y]=1;
if(t[i].y==ed&&t[i].f==0)
qq[t[i].x]=1;
}*/
for(int i=;i<=m;i++) if(qq[i]) printf("%d ",i);printf("\n");
for(int i=m+;i<=m+n;i++) if(qq[i]) printf("%d ",i-m);printf("\n");
printf("%d\n",sum-x/);
return ;
}

那啥*10000就是方大边权。。。ORZ。。。

2016-11-04 09:42:22

【网络流24题】 No.2 太空飞行计划问题 (最大闭合权图 最大流 )的更多相关文章

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

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

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

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

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

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

  4. 【网络流24题】最长k可重区间集问题(费用流)

    [网络流24题]最长k可重区间集问题 [问题分析] 最大权不相交路径问题,可以用最大费用最大流解决. [建模方法] 方法1 按左端点排序所有区间,把每个区间拆分看做两个顶点<i.a>< ...

  5. 【网络流24题】 No.10 餐巾计划问题 (线性规划网络优化 最小费用最大流)

    [题意] 一个餐厅在相继的 N 天里, 每天需用的餐巾数不尽相同. 假设第 i 天需要 ri 块餐巾(i=1,2,-, N). 餐厅可以购买新的餐巾,每块餐巾的费用为 p 分:或者把旧餐巾送到快洗部, ...

  6. 【网络流24题】 No.6 最长不减子序列问题 (最大流)[模型:最多不相交路径]

    [题意] 给定正整数序列x1 ,x2 , x3... ( 1)计算其最长不减子序列的长度 s.( 2)计算从给定的序列中最多可取出多少个长度为 s 的不减子序列.( 3) 如果允许在取出的序列中多次使 ...

  7. 【网络流24题】 No.15 汽车加油行驶问题 (分层图最短路i)

    [题意] 问题描述:给定一个 N*N 的方形网格,设其左上角为起点◎, 坐标为( 1, 1), X 轴向右为正, Y轴向下为正, 每个方格边长为 1, 如图所示. 一辆汽车从起点◎出发驶向右下角终点▲ ...

  8. 【PowerOJ1756&网络流24题】最长k可重区间集问题(费用流)

    题意: 思路: [问题分析] 最大权不相交路径问题,可以用最大费用最大流解决. [建模方法] 方法1 按左端点排序所有区间,把每个区间拆分看做两个顶点<i.a><i.b>,建立 ...

  9. 网络流24题 一句话题解(updating)

      搭配飞行员问题   最简单的一道题 就是一个二分图匹配   太空飞行计划   最大权闭合子图 什么叫"最大权闭合子图"呢? 就是给定一个有向图,在里面选择一个点集,使得点集中的 ...

随机推荐

  1. NChome如何创建单据跟主子表还有扩展开发要怎么弄?

    单据表跟主子表笔记做在笔记本里面 扩展开发在网络备份里面

  2. Windows 7中,用Visual Studio开发WPF应用程序,实现从Windows Explorer中拖拽文件到应用程序,始终显示“无法拖放”符号问题解决方案

    Are you running your application or Visual Studio that hosts the app under administrative privilege? ...

  3. mongodb下载及安装配置教程【仅供参考】

    1 下载 下载页面地址:https://www.mongodb.org/downloads 版本选择:电脑系统是64位的,所以我选择了 Windows 64-bit 2008 R2+ ,msi包 2 ...

  4. VMware Workstation不能启用虚拟设备floppy0由于灭有相应的有效设备在主机上. 你要尝试在每次打开虚拟机电源时连接此虚拟设备?

    编辑虚拟机的硬件,把软盘取消掉,floppy的提示就没有了

  5. Linux消息队列

    #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/ms ...

  6. MySQL数据库原理

    我们知道,数据是信息的载体——一种我们约定了如何解释的符号.在计算机系统中,最常见的应该是文本数据.我们用它记录配置信息,写日志,等等.而在应用程序中,按一定的数据结构来组织数据的方式叫做数据库管理系 ...

  7. 服务器返回的JSON字符串

    异步请求将type设为"json",或者利 用$.getJSON()方法获得服务器返回,那么就不需要eval()方法,因为这时候得到的结果已经是json对象

  8. js+jquery检测用户浏览器型号(包括对360浏览器的检测)

    做网站,js检测用户浏览器的版本,是经常要使用到,今天自己写了一个js,完成了对于一些常见浏览器的检测,但是,偏偏对于360浏览器的检测没有任 何办法,研究了一会儿,无果.无论是360安全浏览器,还是 ...

  9. 参数TFilterPredicate 类型说明

    类型名称:TFilterPredicate 类型定义: type TFilterPredicate = reference to function(const Path: string, const ...

  10. django之JavaScript的简单学习2

    前言:ajax预备知识:json进阶 1.JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON是用字符串来表示Javascript对象: 请大家记住一 ...