NYIST 531 太空飞行计划

太空飞行计划

时间限制:1000 ms  |  内存限制:65535 KB

难度:4

描述

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

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

输入
多组测试数据(不超过500组)
每组数据第1行有2 个正整数m和n(m,n <= 100)。m是实验数,n是仪器数。接下来的m 行,每行是一个实验的有关数据。第一个数赞助商同意支付该实验的费用f(f < 10000);接着是该实验需要用到的仪器的个数t,接着是t个仪器的编号。最后一行的n个数是配置每个仪器的费用pi(pi <=100)。
输出
每组数据输出占一行,输出最大的净收益(如果无法收益,输出0)。
样例输入
2 3
10 2 1 2
25 2 2 3
5 6 7
样例输出
17
上传者
ACM_杨延玺
解题:最大权闭合子图,输入真尼玛蛋疼,好吧,原来的那个题,有几组数据貌似有问题。南阳这个只需要输出最大权值就是了,不需要输出实验编号以及仪器编号

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cmath>
  5 #include <algorithm>
  6 #include <climits>
  7 #include <vector>
  8 #include <queue>
  9 #include <cstdlib>
 10 #include <string>
 11 #include <set>
 12 #include <stack>
 13 #define LL long long
 14 #define pii pair<int,int>
 15 #define INF 0x3f3f3f3f
 16 using namespace std;
 17 const int maxn = 500;
 18 struct arc{
 19     int to,flow,next;
 20     arc(int x = 0,int y = 0,int z = -1){
 21         to = x;
 22         flow = y;
 23         next = z;
 24     }
 25 };
 26 arc e[maxn*maxn];
 27 int head[maxn],d[maxn],cur[maxn];
 28 int tot,m,n,S,T;
 29 void add(int u,int v,int flow){
 30     e[tot] = arc(v,flow,head[u]);
 31     head[u] = tot++;
 32     e[tot] = arc(u,0,head[v]);
 33     head[v] = tot++;
 34 }
 35 bool bfs(){
 36     memset(d,-1,sizeof(d));
 37     d[S] = 1;
 38     queue<int>q;
 39     q.push(S);
 40     while(!q.empty()){
 41         int u = q.front();
 42         q.pop();
 43         for(int i = head[u]; ~i; i = e[i].next){
 44             if(e[i].flow && d[e[i].to] == -1){
 45                 d[e[i].to] = d[u] + 1;
 46                 q.push(e[i].to);
 47             }
 48         }
 49     }
 50     return d[T] > -1;
 51 }
 52 int dfs(int u,int low){
 53     if(u == T) return low;
 54     int tmp = 0,a;
 55     for(int &i = cur[u]; ~i; i = e[i].next){
 56         if(e[i].flow && d[e[i].to] == d[u] + 1 &&(a=dfs(e[i].to,min(e[i].flow,low)))){
 57             e[i].flow -= a;
 58             e[i^1].flow += a;
 59             tmp += a;
 60             low -= a;
 61             if(!low) break;
 62         }
 63     }
 64     if(!tmp) d[u] = -1;
 65     return tmp;
 66 }
 67 int dinic(){
 68     int ans = 0;
 69     while(bfs()){
 70         memcpy(cur,head,sizeof(head));
 71         ans += dfs(S,INF);
 72     }
 73     return ans;
 74 }
 75 void go(int u){
 76     char str[maxn];
 77     gets(str);
 78     for(int i = 0; str[i];){
 79         while(str[i] &&(str[i] < ‘0‘ || str[i] > ‘9‘)) ++i;
 80         int x = 0;
 81         while(str[i] && str[i] >= ‘0‘ && str[i] <= ‘9‘){
 82             x = x*10 + str[i++] - ‘0‘;
 83         }
 84         if(x) add(u,x+m,INF);
 85     }
 86 }
 87 bool vis[maxn];
 88 vector<int>ans1,ans2;
 89 void dfs(int u){
 90     vis[u] = true;
 91     for(int i = head[u]; ~i; i = e[i].next){
 92         if(vis[e[i].to] || e[i].flow == 0) continue;
 93         if(e[i].to > m) ans2.push_back(e[i].to-m);
 94         else ans1.push_back(e[i].to);
 95         dfs(e[i].to);
 96     }
 97 }
 98 bool cmp(int a,int b){
 99     return a > b;
100 }
101 int main() {
102     int w;
103     while(~scanf("%d %d",&m,&n)){
104         memset(head,-1,sizeof(head));
105         int ans = S = tot = 0;
106         T = n + m + 1;
107         ans1.clear();
108         ans2.clear();
109         for(int i = 1; i <= m; ++i){
110             scanf("%d",&w);
111             add(S,i,w);
112             ans += w;
113             go(i);
114         }
115         for(int i = 1; i <= n; ++i){
116             scanf("%d",&w);
117             add(m+i,T,w);
118         }
119         ans -= dinic();
120         /*memset(vis,false,sizeof(vis));
121         dfs(S);
122         sort(ans1.begin(),ans1.end(),cmp);
123         sort(ans2.begin(),ans2.end(),cmp);
124         for(int i = ans1.size()-1; i >= 0; --i)
125             printf("%d%c",ans1[i],i?‘ ‘:‘\n‘);
126         for(int i = ans2.size()-1; i >= 0; --i)
127             printf("%d%c",ans2[i],i?‘ ‘:‘\n‘);*/
128         printf("%d\n",ans);
129     }
130     return 0;
131 }

时间: 2024-12-28 01:43:22

NYIST 531 太空飞行计划的相关文章

[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教授的任务是找出一个有效算法,确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才能使太空飞行的净收益最大.这里净收

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

[网络流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

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

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

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

太空飞行计划问题(luogu) Description 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润. 现已确定了一个可供选择的实验集合 E={E1?,E2?,?,Em?},和进行这些实验需要使用的全部仪器的集合 I={I1?,I2?,?,In?}. 实验 Ej? 需要用到的仪器是 I 的子集 Rj?⊆I. 配置仪器 I_k? 的费用为 c_k? 美元.实验 E_j 的赞助商已同意为该实验结果支付 p_j 美元.W 教授的任务是找出一个有

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

[问题描述]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教授的任务是找出一个有效算法,确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才能使太空飞行的净收益最大.这里净收益是指进行实验所