刷题总结——太空飞行计划(最大权闭合子图用最大流解决)

题目:

题目描述

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

输入格式

输入文件第 1 行有 2 个正整数 m 和 n(1<=m,n<=400)。其中 m 是实验数,n 是仪器数。接下来的 m 行,每行是一个实验的有关数据(每个数不超过50)。第一个数赞助商同意支付该实验的费用;接着是该实验需要用到的若干仪器的编号。最后一行的 n 个数是配置每个仪器的费用。

输出格式

输出一个整数,即最大的净收益值。

样例数据 1

输入  [复制]

2 3 
10 1 2 
25 2 3 
5 6 7

输出

17

题解:

比较明显可以看出是一个最大权闭合子图(定义参见网上资料)

这里给出求最大权闭合子图方法:

建一个网络,s连正点,边权设为所连点点权;负点权向t点连边,边权为所出发点点权绝对值,点与点之间连原图上的边,边权为inf

可以证明答案为正权和-最大流(最小割)(具体怎么证的看http://www.cnblogs.com/wuyiqi/archive/2012/03/12/2391960.html(引用,%%%%%%))

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int inf=1e+9;
const int N=1000;
int first[N*2],go[N*N],next[N*N],rest[N*N],tot=1,lev[N];
int m,n,src,des,ans;
char t;
inline void comb(int a,int b,int c)
{
  next[++tot]=first[a],first[a]=tot,go[tot]=b,rest[tot]=c;
  next[++tot]=first[b],first[b]=tot,go[tot]=a,rest[tot]=0;
}
inline bool bfs()
{
  static int que[N*4],tail;
  for(int i=src;i<=des;i++)  lev[i]=-1;
  que[tail=1]=src;
  lev[src]=0;
  for(int head=1;head<=tail;head++)
  {
    int u=que[head];
    for(int e=first[u];e;e=next[e])
    {
      int v=go[e];
      if(rest[e]&&lev[v]==-1)
      {
        lev[v]=lev[u]+1;
        que[++tail]=v;
        if(v==des)
          return true;
      }
    }
  }
  return false;
}
inline int dinic(int u,int flow)
{
  if(u==des)
    return flow;
  int res=0,delta,v;
  for(int e=first[u];e;e=next[e])
  {
    v=go[e];
    if(lev[v]>lev[u]&&rest[e])
    {
      delta=dinic(v,min(rest[e],flow-res));
      if(delta)
      {
        rest[e]-=delta;
        rest[e^1]+=delta;
        res+=delta;
        if(res==flow)  break;
      }
    }
  }
  if(res!=flow)  lev[u]=-1;
  return res;
}
void maxflow()
{
  while(bfs())
    ans+=dinic(src,inf);
}
int main()
{
  //freopen("a.in","r",stdin);
  scanf("%d%d",&m,&n);
  src=0,des=n+m+1;
  int a,tot=0;
  for(int i=1;i<=m;i++)
  {
    scanf("%d",&a);
    comb(0,i,a);
    tot+=a;
    scanf("%c",&t);
    while(t!=‘\n‘)
    {
      scanf("%d",&a);
      comb(i,m+a,inf);
      scanf("%c",&t);
    }
  }
  for(int i=1;i<=n;i++)
  {
    scanf("%d",&a);
    comb(m+i,des,a);
  }
  maxflow();
  cout<<tot-ans<<endl;
  return 0;
}
时间: 2024-10-11 00:41:56

刷题总结——太空飞行计划(最大权闭合子图用最大流解决)的相关文章

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

727. [网络流24题] 太空飞行计划 ★★☆ 输入文件:shuttle.in 输出文件:shuttle.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的集合I={ I1, I2,…,In }.实验Ej 需要用到的仪器是I的子集Rj∈I.配置仪器Ik 的费用为ck 美元.实验Ej

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

#6001. 「网络流 24 题」太空飞行计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合 E={E1,E2,?,Em} E = \{ E_1, E_2, \cdots, E_m \}E={E?1??,E?2??,?,E?m??},和进行这些实验

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

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

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

OJ题号:洛谷2762.LOJ6001.CodeVS1233 题目大意: 有$n$个实验和$m$个仪器,每个实验需要依赖若干个仪器,不同实验可以共享一个仪器. 已知每一个实验$x$,有$p_x$的收益,每一个仪器$y$,有$c_y$的花费. 求最大净收益. 思路: 建立超级源汇$S$和$T$, 对于每一个实验$x$,连一条从$S$到$x$的容量为$p_x$的边: 对于每一个实验$x$对应的每一个仪器$y$,连一条从$x$到$y$的容量为$\infty$的边: 对于每一个仪器$y$连一条从$y$到

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

题目链接 思路 问题模型:最大权闭合图 转化模型:网络最小割 这道题是网络流中一个比较重要的模型:最大权闭合图转最大流 建立超级源点\(S\)和超级汇点\(T\),然后每个实验连一条从\(S\)到实验,流量为实验收益的边,每个仪器连一条从仪器到\(T\), 流量为仪器耗费的边,然后需要的仪器就连一条从实验到仪器流量为\(inf\)(无穷大)的边,因为实验到仪器的边的流量为正无穷,所以最小割一定不会在上面,根据最大流最小割定理,最大流就等于最小割,我们按照以上所说建图,求出最大流,之后用实验利益的

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

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

网络流24题之太空飞行计划

题目大意: 有n个实验要做,做掉奖励相应的钱,但是每个实验需要相应的仪器,每个仪器启动起来要相应的钱,安排使得赚钱最多. 首先引入一个闭合图的概念. 闭合图就是原图的一个子图,如果一个点u在这个子图内,那么它连出去的所有点v也要在这个子图内. 最大权闭合图就是点的权值和最大的闭合图. 模型分析: 1.很明显这是一个二分图,每个实验向需要的仪器连有向边,实验的点权为正,仪器的点权为负,要求最大权闭合图. 2.这是一个选或不选的问题,所以可以转化成最小割的模型,把选的归为S集,不选的归为T集.但是要

【PowerOJ1737&amp;网络流24题】太空飞行计划问题(最小割)

题意: 思路: 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef unsigned int uint; 5 typedef unsigned long long ull; 6 typedef long double ld; 7 typedef pair<int,int> PII; 8 typedef pair<ll,ll> Pll; 9 typedef v

《图论资料》最大权闭合子图

首先我们由一道题来引入,见 [线性规划与网络流24题 2] 太空飞行计划问题 . 这道题中,实验依赖于仪器,而实验和仪器都有权值,且仪器为负,实验为正. 这里闭合图的概念就很好引出了.在一个图中,我们选取一些点构成集合,记为V,且集合中的出边(即集合中的点的向外连出的弧),所指向的终点(弧头)也在V中,则我们称V为闭合图.最大权闭合图即在所有闭合图中,集合中点的权值之和最大的V,我们称V为最大权闭合图. 上图中闭合图有 {5}.{2,5}.{4,5} {2,4,5}.{3,4,5} {1,2,3