Wiki 1233(太空飞行计划问题-最大权闭合子图)
来源:互联网 发布:图片美化软件 编辑:程序博客网 时间:2024/04/28 16:31
题目描述 Description
W 教授正在为国家航天中心计划一系列的太空飞行。每次太空飞行可进行一系列商业性实验而获取利润。现已确定了一个可供选择的实验集合 E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的集合 I={I1, I2,… I n } 。实验 Ej需要用到的仪器是 I 的子集 Rj˝I。配置仪器 Ik的费用为 ck美元。实验 Ej的赞助商已同意为该实验结果支付 pj美元。W 教授的任务是找出一个有效算法,确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才能使太空飞行的净收益最大。这里净收益是指进行实验所获得的全部收入与配置仪器的全部费用的差额。
对于给定的实验和仪器配置情况,编程找出净收益最大的试验计划。
输入描述 Input Description
第 1 行有 2 个正整数 m和 n。m 是实验数,n 是仪器数。接下来的 m 行,每行是一个实验的有关数据。第一个数赞助商同意支付该实验的费用;接着是该实验需要用到的若干仪器的编号。最后一行的 n 个数是配置每个仪器的费用。
输出描述 Output Description
第 1 行是实验编号;第 2行是仪器编号;最后一行是净收益。
样例输入 Sample Input
2 3
10 1 2
25 2 3
5 6 7
样例输出 Sample Output
最大权闭合子图,入门题。1 2
1 2 3
17
把S向正费用点连边,T向负费用点连边,原图的边间连+oo
然后做最小割=min(未选收益+选花费)
答案=选收益-选花费=全选收益-(未选收益+选花费)
#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#include<functional>#include<cmath>#include<cctype>#include<cassert>#include<climits>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define ForD(i,n) for(int i=n;i;i--)#define Forp(x) for(int p=pre[x];p;p=next[p])#define RepD(i,n) for(int i=n;i>=0;i--)#define MEM(a) memset(a,0,sizeof(a))#define MEMI(a) memset(a,127,sizeof(a))#define MEMi(a) memset(a,128,sizeof(a))#define INF (2139062143)#define F (1000000009)#define MAXN (1000000)#define MAXM (1000000)typedef long long ll;int edge[MAXM],pre[MAXN]={0},next[MAXM]={0},weight[MAXM],size=1;void addedge(int u,int v,int w){ edge[++size]=v; weight[size]=w; next[size]=pre[u]; pre[u]=size;}void addedge2(int u,int v,int w){addedge(u,v,w),addedge(v,u,0);}int n1,n2,s,t,n;int d[MAXN]={0},cnt[MAXN]={0};int sap(int x,int flow){ if (x==t) return flow; int nowflow=0; Forp(x) { int &v=edge[p]; if (d[x]-1==d[v]&&weight[p]>0) { int fl=sap(v,min(weight[p],flow)); nowflow+=fl,flow-=fl,weight[p]-=fl,weight[p^1]+=fl; if (!flow) return nowflow; } } if (!(--cnt[d[x]++])) d[s]=n+1; cnt[d[x]]++; return nowflow;}int label[MAXN]={0};void dfs(int x){ label[x]=1; Forp(x) { int &v=edge[p]; if (weight[p]>0&&!label[v]) dfs(v); }}int t1[MAXN],t2[MAXN];int main(){ //freopen("wiki1233.in","r",stdin); scanf("%d%d",&n1,&n2); //n1:expr n2:mechine n=n1+n2+2;s=n-1,t=n; int total=0; For(i,n1) { int w; scanf("%d",&w);addedge2(s,i,w);t1[i]=size-1; total+=w; //cout<<w<<' '; char c; while (c=getchar()) { if (c=='\n') break; else if (isdigit(c)) { int a; ungetc(c,stdin);scanf("%d",&a); addedge2(i,n1+a,INF); } } }//cout<<endl; For(i,n2) { int w; scanf("%d",&w);addedge2(n1+i,t,w);t2[i]=size-1;t2[i]=size-1; } int ans=0;cnt[0]=n; while (d[s]<=n) ans+=sap(s,INF); dfs(s); //For(i,n) if (label[i]) cout<<i<<' ';cout<<endl; For(i,n1) if (label[i]^label[s]==0) cout<<i<<' ';cout<<endl; For(i,n2) if (label[n1+i]^label[t]) cout<<i<<' ';cout<<endl; /* bool b=0; For(i,n1) cout<<weight[t1[i]]<<' ';cout<<endl; For(i,n1) if (weight[t1[i]^1]==0) { if (b) printf(" ");b=1; printf("%d",i); } puts(""); b=0; For(i,n2) if (weight[t2[i]]==0) { if (b) printf(" ");b=1; printf("%d",i); } puts(""); */ cout<<total-ans<<endl; //while (1); return 0;}
- Wiki 1233(太空飞行计划问题-最大权闭合子图)
- Wiki 1233(太空飞行计划问题-最大权闭合子图)
- 二、太空飞行计划问题 [最大权闭合图]
- 太空飞行计划问题(最大权闭合图)
- 太空飞行计划 最大权闭合图
- PowerOJ 1737 网络流24题之二 太空飞行计划问题(最大权闭合子图)
- 网络流24题之二 太空飞行计划 最大权闭合子图
- 网络流24题之太空飞行计划——最大权闭合子图
- Cogs 727. [网络流24题] 太空飞行计划(最大权闭合子图)
- 【网络流24题 太空飞行计划】最大权闭合子图
- 【loj】#6001. 「网络流 24 题」太空飞行计划(最大权闭合子图)
- LOJ 「网络流 24 题」太空飞行计划(最大权闭合子图)
- loj #6001. 「网络流 24 题」太空飞行计划(最大权闭合子图)
- ★ 太空飞行计划 最大权闭合图+输出方案
- 【网络流二十四题 太空飞行计划问题】【最大权闭合图->最小割】
- 线性规划与网络流24题 2太空飞行计划问题 最大权闭合图问题(不懂) nefu 476
- 线性规划与网络流24题の2 太空飞行计划问题(最大权闭合图问题)
- 线性规划与网络流24题之太空飞行计划 最大权闭合图
- 10个经典的Android开源应用项目
- HDU 2089 不要62(数位DP入门)
- [小说]魔王冢(2)意乱情迷
- 博士生传给硕士生的经验!
- vi 命令详解
- Wiki 1233(太空飞行计划问题-最大权闭合子图)
- 内存泄漏与内存溢出的区别
- java的向下转型
- Lambda表达式介绍
- hibernate中N+1问题解决办法
- 向Intel迁移!(上)
- 深入剖析浮点存储及其运算规则
- error: variable '__this_module' has initializer but incomplete type错误解决
- extern 用法详解