博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
COGS727 [网络流24题] 太空飞行计划
阅读量:6658 次
发布时间:2019-06-25

本文共 2745 字,大约阅读时间需要 9 分钟。

【问题描述】

W 教授正在为国家航天中心计划一系列的太空飞行。每次太空飞行可进行一系列商业性实验而获取利润。现已确定了一个可供选择的实验集合E={

E1,E2,…,Em},和进行这些实验需要使用的全部仪器的集合I={ I1, I2,…,I}。实验E需要用到的仪器是I的子集RjI。配置仪器I的费用为c美元。实验E的赞助商已同意为该实验结果支付p美元。W教授的任务是找出一个有效算法,确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才能使太空飞行的净收益最大。这里净收益是指进行实验所获得的全部收入与配置仪器的全部费用的差额。

【编程任务】

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

【数据输入】

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

【结果输出】

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

【输入文件示例】shuttle.in

2 310 1 225 2 35 6 7

【输出文件示例】shuttle.out

1 21 2 317

 

图论 网络流 特别的读入技巧

题目本身就是个裸的最大权闭合子图,没什么好说的

但是这个输入数据很好玩啊,每行没有终止标记。

但是读入也没什么难的,把读入优化魔改了一下就可以直接用了。

交上去发现还是T了,下回来数据发现——数据文件前两行有两个换行符,然后才是m和n,于是17行那样的写法就直接炸了

多加了一个enter标记,换成22行和105行那样的写法就妥了。

中途因为忘了改文件操作就交,又炸了两次

本来以为能1A来着……获得技能[迷之自信] @布吕歇尔自信姬

 

1 /*by SilverN*/  2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 using namespace std; 10 const int INF=0x3f3f3f3f; 11 const int mxn=100010; 12 bool enter=0; 13 int read(){ 14 int x=0,f=1;char ch=getchar(); 15 while(ch<'0' || ch>'9'){ 16 if(ch=='-')f=-1; 17 // if(ch=='\r' || ch=='\n')return -1;//并没有卵用 18 ch=getchar(); 19 } 20 while(ch>='0' && ch<='9'){ 21 x=x*10+ch-'0';ch=getchar(); 22 if(ch=='\r' || ch=='\n')enter=1; 23 } 24 return x*f; 25 } 26 inline int min(int a,int b){ return a
q; 40 bool BFS(){ 41 memset(d,0,sizeof d); 42 q.push(S);d[S]=1; 43 while(!q.empty()){ 44 int u=q.front();q.pop(); 45 for(int i=hd[u],v;i;i=e[i].nxt){ 46 v=e[i].v; 47 if(e[i].f && !d[v]){ 48 d[v]=d[u]+1; 49 50 q.push(v); 51 } 52 } 53 } 54 return d[T]; 55 } 56 int DFS(int u,int lim){ 57 if(u==T)return lim; 58 int f=0,tmp; 59 for(int i=hd[u],v;i;i=e[i].nxt){ 60 v=e[i].v; 61 if(e[i].f && d[v]==d[u]+1 && (tmp=DFS(v,min(e[i].f,lim)))){ 62 e[i].f-=tmp; 63 e[i^1].f+=tmp; 64 lim-=tmp; 65 f+=tmp; 66 if(!lim)return f; 67 } 68 } 69 d[u]=0; 70 return f; 71 } 72 int Dinic(){ 73 int res=0; 74 while(BFS())res+=DFS(S,INF); 75 return res; 76 } 77 int n,m; 78 int ans=0; 79 void solve(){ 80 ans-=Dinic(); 81 for(int i=1;i<=m;i++) 82 if(d[i])printf("%d ",i); 83 puts(""); 84 for(int i=1;i<=n;i++){ 85 if(d[i+m])printf("%d ",i); 86 } 87 puts(""); 88 printf("%d\n",ans); 89 return; 90 } 91 int main(){ 92 // freopen("in.txt","r",stdin); 93 freopen("shuttle.in","r",stdin); 94 freopen("shuttle.out","w",stdout); 95 int i,j,x; 96 m=read();n=read(); 97 S=0;T=m+n+1; 98 for(i=1;i<=m;i++){ 99 x=read();100 ans+=x;101 insert(S,i,x);102 enter=0;//103 while(!enter){104 x=read();105 if(x==-1)break;106 insert(i,x+m,INF);107 }108 }109 for(i=1;i<=n;i++){110 x=read();111 insert(i+m,T,x);112 }113 solve();114 return 0;115 }

 

转载于:https://www.cnblogs.com/SilverNebula/p/6644814.html

你可能感兴趣的文章
与众不同 windows phone (26) - Contacts and Calendar(联系人和日历)
查看>>
secureCRT linux shell显示中文乱码 解决方法
查看>>
[Express] Level 3: Reading from the URL
查看>>
android开发类似coverflow效果的3d旋转
查看>>
Codeforces 437B The Child and Set
查看>>
POJ训练计划2777_Count Color(线段树/成段更新/区间染色)
查看>>
取消mod_sofia的呼叫鉴权
查看>>
几何画板如何用描点法画二次函数
查看>>
老友记
查看>>
oracle12c ORA-28040: No matching authentication protocol
查看>>
matlab中如何求某一个矩阵的标准差和均值
查看>>
Leetcode: Find Peak Element
查看>>
Android 抓包,监控流量工具之 mitmproxy
查看>>
hOAuth2.0认证和授权原理
查看>>
Leetcode: Sentence Screen Fitting
查看>>
How To PLAY_SOUND in Oracle Forms
查看>>
atitit.提升开发效率---使用server控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比較...
查看>>
资源下载南方cass视频教程,包括文档,数据,很全的
查看>>
CoreAudio实现录音播音和扬声器听筒模式的切换
查看>>
CSV
查看>>