博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【网络流24题】太空飞行计划问题 题解
阅读量:2305 次
发布时间:2019-05-09

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

题目大意: 有一些实验和一些仪器,每个实验要用到一些仪器,做一个实验有收益,用一个仪器有代价,现在选择做一些实验,假如两个实验用到同一个仪器,不需要支付两次代价,问最大利益是多少。

题解

题解参照,这篇博客只是贴个代码:

#include 
#include
#include
using namespace std;#define maxn 210#define inf 999999999int n,m,val[maxn],S,T,sum=0;struct edge{
int x,y,z,next;};edge e[maxn*maxn<<1];int first[maxn],len=1;void buildroad(int x,int y,int z){
e[++len]=(edge){
x,y,z,first[x]}; first[x]=len;}int h[maxn],q[maxn],st,ed;bool bfs(){
memset(h,0,sizeof(h)); st=ed=1;q[st]=S;h[S]=1; while(st<=ed) {
int x=q[st++]; for(int i=first[x];i;i=e[i].next) if(!h[e[i].y]&&e[i].z)h[q[++ed]=e[i].y]=h[x]+1; } return h[T];}int dfs(int x,int flow){
if(x==T)return flow; int tt=0,p; for(int i=first[x];i;i=e[i].next) {
int y=e[i].y; if(h[y]==h[x]+1&&e[i].z) {
p=dfs(y,min(e[i].z,flow-tt));tt+=p; e[i].z-=p;e[i^1].z+=p; if(tt==flow)break; } } if(!tt)h[x]=0; return tt;}int main(){
scanf("%d %d",&n,&m);S=n+m+1;T=S+1; for(int i=1,x;i<=n;i++) {
scanf("%d",&x);sum+=x; buildroad(S,i,x),buildroad(i,S,0); while(getchar()==' ')scanf("%d",&x), buildroad(i,x+n,inf),buildroad(x+n,i,0); } for(int i=1;i<=m;i++)scanf("%d",&val[i]), buildroad(i+n,T,val[i]),buildroad(T,i+n,0); int ans=0; while(bfs())ans+=dfs(S,inf); for(int i=1;i<=n;i++)if(h[i])printf("%d ",i);//输出与S相连的点 printf("\n"); for(int i=1;i<=m;i++)if(h[i+n])printf("%d ",i); printf("\n"); printf("%d\n",sum-ans);}

转载地址:http://rcnib.baihongyu.com/

你可能感兴趣的文章
在表格中实现搜索
查看>>
点击表格中任意一行,转到相应的页面
查看>>
在UIView中添加多个大小一样的框框 (小View)
查看>>
纯代码为多个小框框中添加图像、文字和按钮
查看>>
xcode 运行错误总结
查看>>
字典转模型的例子
查看>>
UIAlertView的基本使用和对话框中按钮的事件处理方法
查看>>
常用结构体
查看>>
基本数据类型的包装类
查看>>
NSArray数组(1)
查看>>
NSArray数组(2)
查看>>
NSDictionary 字典类
查看>>
NSSet 集合
查看>>
集合之间相互转换
查看>>
集合的内存管理
查看>>
文件操作
查看>>
NSData
查看>>
日期操作
查看>>
iOS的三种弹框
查看>>
UIApplication和程序启动过程
查看>>