太空飞行计划问题(最大流)

太空飞行计划问题(luogu)

Description

题目描述

W 教授正在为国家航天中心计划一系列的太空飞行。每次太空飞行可进行一系列商业性实验而获取利润。

现已确定了一个可供选择的实验集合 E={E1?,E2?,?,Em?},和进行这些实验需要使用的全部仪器的集合 I={I1?,I2?,?,In?}。

实验 Ej? 需要用到的仪器是 I 的子集 Rj?⊆I。

配置仪器 I_k? 的费用为 c_k? 美元。实验 E_j 的赞助商已同意为该实验结果支付 p_j 美元。W 教授的任务是找出一个有效算法,

确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才能使太空飞行的净收益最大。

这里净收益是指进行实验所获得的全部收入与配置仪器的全部费用的差额。

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

输入格式

第 1 行有 2 个正整数 m 和 n。m 是实验数,n 是仪器数。接下来的 m 行,每行是一个实验的有关数据。

第一个数赞助商同意支付该实验的费用;接着是该实验需要用到的若干仪器的编号。最后一行的 n 个数是配置每个仪器的费用。

输出格式

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

Solution

这道题有一个隐形条件: p 和 c 都大于等于0

首先假设不需要支付配置仪器的费用,那么我们可以赚 $\sum\limits_{i=1}^{m}$p_i。

但一部分钱需要用于配置仪器,那么我们建一张图,

将源点与实验连一条容量为 p_i 的边,表示做该实验最多获得 P-i 元;

将实验与每个它需要的仪器连一条容量无限大的边,表示该实验获得的钱可用于支付配置该仪器的费用,

别的实验不用跟这个仪器连边,因为如果所有需要该仪器的实验获得的钱都不够配置它的话,还不如不买它,不做需要它的实验;

将仪器与汇点连一条容量为 c-i 的边,表示它需要 c-i 元。

这个大佬的图好

该图的最大流表示 用于配置仪器的费用 + 不如不做的实验的总收益

于是答案为 $\sum\limits_{i=1}^{m}$p_i -最大流

方案先求出需要的仪器:去掉仪器 i 与汇点的边后求出的最大流是否与原最大流差值为 c-i

然后推出可以做的实验

Code

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=110;
int m,n,cost[N],p[N],b[N][N],s,t,sum;
int head[N],ver[N*N],d[N],nxt[N*N],tot=1,edge[N*N],flow,maxflow;
bool sel[N];
void add(int x,int y,int w)
{
    ver[++tot]=y,nxt[tot]=head[x],head[x]=tot,edge[tot]=w;
    ver[++tot]=x,nxt[tot]=head[y],head[y]=tot,edge[tot]=0;
}
bool bfs()
{
    memset(d,0,sizeof(d));
    queue <int> q;
    q.push(s),d[s]=1;
    while(!q.empty())
    {
        int x=q.front();
        q.pop();
        for(int i=head[x],y;i;i=nxt[i])
            if(edge[i]>0 && !d[y=ver[i]])
            {
                d[y]=d[x]+1;
                q.push(y);
                if(y==t) return 1;
            }
    }
    return 0;
}
int dinic(int x,int flow)
{
    if(x==t) return flow;
    int rest=flow;
    for(int i=head[x],y;i && rest;i=nxt[i])
        if(edge[i]>0 && d[y=ver[i]]==d[x]+1)
        {
            int kk=dinic(y,min(edge[i],rest));
            if(!kk) d[y]=0;
            edge[i]-=kk,edge[i^1]+=kk;
            rest-=kk;
        }
    return flow-rest;
}
int main()
{
    scanf("%d%d",&m,&n);
    s=0,t=n+m+1;
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&p[i]);
        sum+=p[i];
        add(s,i,p[i]);
        char tools[10000];
        memset(tools,0,sizeof tools);
        cin.getline(tools,10000);
        int ulen=0,tool;
        while(sscanf(tools+ulen,"%d",&tool)==1)
        {
            b[i][++b[i][0]]=tool;
            add(i,tool+m,1<<30);
            if(tool==0) ulen++;
            else while (tool) tool/=10,ulen++;
            ulen++;
        }
    }
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&cost[i]);
        add(i+m,t,cost[i]);
    }
    while(bfs()) while(flow=dinic(s,1<<30)) maxflow+=flow;
    for(int i=1;i<=n;i++)
    {
        memset(head,0,sizeof(head)),tot=1;
        for(int j=1;j<=m;j++)
        {
            add(s,j,p[j]);
            for(int k=1;k<=b[j][0];k++)
                add(j,b[j][k]+m,1<<30);
        }
        for(int j=1;j<=n;j++)
            if(j!=i) add(j+m,t,cost[j]);
        int ans=0;
        while(bfs()) while(flow=dinic(s,1<<30)) ans+=flow;
        if(maxflow-ans==cost[i]) sel[i]=true;
    }
    for(int i=1;i<=m;i++)
        while(p[i]<0);
    for(int i=1;i<=n;i++)
        while(cost[i]<0);
    for(int i=1;i<=m;i++)
    {
        bool flag=true;
        for(int j=1;j<=b[i][0];j++)
            if(!sel[b[i][j]])
            {
                flag=false;
                break;
            }
        if(flag) printf("%d ",i);
    }
    puts("");
    for(int i=1;i<=n;i++)
        if(sel[i]) printf("%d ",i);
    printf("\n%d\n",sum-maxflow);
    return 0;
}

原文地址:https://www.cnblogs.com/hsez-cyx/p/12359907.html

时间: 2024-08-08 11:10:41

太空飞行计划问题(最大流)的相关文章

[网络流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题第2题 太空飞行计划 最小割

/** 题目: 线性规划与网络流24题第2题 太空飞行计划 最小割 链接:http://www.cogs.pro/cogs/problem/problem.php?pid=727 题意:lv 思路:最大点权独立集(点集中任意两个点没有边相连,且点权和最大)=点权总和-最小点权覆盖集. 将实验和仪器看做节点. 实验放在二分图的左边, s->x, cap = 实验利润. 仪器放在右边, x->t, cap = 仪器费用. 如果实验u的进行需要仪器v,u->v, cap = INF. ans

[FZYZOJ 1355] 8-2 太空飞行计划问题

P1355 -- 8-2 太空飞行计划问题 时间限制:1000MS 内存限制:131072KB Description W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的集合I={I1,I2,…In}.实验Ej需要用到的仪器是I的子集RjÍI.配置仪器Ik的费用为ck美元.实验Ej的赞助商已同意为该实验结果支付pj美元.W教授的任务是找出一个有效算法,确定在

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

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

NYIST 531 太空飞行计划

太空飞行计划 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述        W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的集合I={I1,I2,…In}.实验Ej需要用到的仪器是I的子集Rj .配置仪器Ik的费用为ck美元.实验Ej的赞助商已同意为该实验结果支付pj美元.W教授的任务是找出一个有效算法,确定在一次太空飞行中要

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

「网络流24题」2. 太空飞行计划问题 <题目链接> 最大权闭合子图. 源点与实验连边权为实验费用的有向边: 仪器与汇点连边权为仪器费用的有向边: 实验与仪器之间连边权为INF的有向边. 答案为所有与源点相连的边的边权和减去图的最小割. 证明见国集队员胡伯涛论文<最小割模型在信息学竞赛中的应用>. 输出路径时,最后一次层次图中: 与源点相连的点即选做的实验:与汇点相连的点即选用的仪器. 注意 ·读入数据时,读到空格继续,否则停止. ·仪器部分的点权+50,避免两部点权相同. #in

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

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

洛谷 P2762 太空飞行计划问题

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