太空飞行计划 网络流

经典的最大权闭合子图问题;

这种问题的求解思路是:

建图:将s连边向权值为正的点,通过依赖关系连接权值为正的点和权值为负的点,权值为负的点连边向t;

求c=最小割,a=所有权值为正的节点权值和,ans=a-c;

证明过程网上是有的;

用dinic敲的,但是用的还不熟练;

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<cstdlib>
 6 #include<ctime>
 7 #include<algorithm>
 8 using namespace std;
 9 const int maxn=200;
10 const int inf=1000000000;
11 const int s=0,t=120;
12 struct node{
13     int y,next,flow,re;
14 }e[maxn*10];
15 int linkk[maxn],len=0,n,m,g[maxn][maxn],cnt[maxn],w[maxn],sum=0;
16 void print(int x){printf("%d\n",x);}
17 void print(int x,int y){printf("%d %d\n",x,y);}
18 void insert(int x,int y,int flow){
19     e[++len].y=y;e[len].flow=flow;
20     e[len].next=linkk[x];linkk[x]=len;e[len].re=len+1;
21     e[++len].y=x;e[len].flow=0;
22     e[len].next=linkk[y];linkk[y]=len;e[len].re=len-1;
23 }
24 bool flag=0;
25 int read(){
26     int x=0;char ch=getchar();
27     while(ch<‘0‘||ch>‘9‘)ch=getchar();
28     while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
29     if(ch==‘\n‘)flag=1;
30     return x;
31 }
32 void init(){
33     scanf("%d%d",&n,&m);
34     int v;
35     for(int i=1;i<=n;i++){
36         scanf("%d",&v);insert(s,i,v);
37         flag=0;sum+=v;
38         while(!flag){cnt[i]++;g[i][cnt[i]]=read();}
39     }
40     for(int i=1;i<=m;i++)scanf("%d",&w[i]);
41     for(int i=1;i<=n;i++)
42         for(int j=1;j<=cnt[i];j++)
43             insert(i,g[i][j]+n,inf);
44     for(int i=1;i<=m;i++)insert(i+n,t,w[i]);
45 }
46 int q[maxn],tail=0,level[maxn],head=0;
47 bool bfs(){
48     memset(level,-1,sizeof(level));
49     head=0;tail=0;level[s]=1;q[++tail]=s;
50     while(++head<=tail){
51         int x=q[head];
52         for(int i=linkk[x];i;i=e[i].next){
53             if(level[e[i].y]==-1&&e[i].flow){
54                 q[++tail]=e[i].y;
55                 level[e[i].y]=level[x]+1;
56             }
57         }
58     }
59     return level[t]>0;
60 }
61 int find(int x,int flow){
62     if(x==t)return flow;
63     int maxflow=0,d=0;
64     for(int i=linkk[x];i&&maxflow<flow;i=e[i].next){
65         if(level[e[i].y]==level[x]+1&&e[i].flow){
66             if(d=find(e[i].y,min(flow-maxflow,e[i].flow))){
67                 maxflow+=d;
68                 e[i].flow-=d;
69                 e[e[i].re].flow+=d;
70             }
71         }
72     }
73     if(!maxflow)level[x]=-1;
74     return maxflow;
75 }
76 void work(){
77     int d=0,ans=0;
78     while(bfs())
79         while(d=find(s,inf))
80             ans+=d;
81     cout<<sum-ans<<endl;
82 }
83 int main(){
84     //freopen("1.in","r",stdin);
85     //freopen("1.out","w",stdout);
86     init();
87     work();
88 }

时间: 2024-10-02 13:18:01

太空飞行计划 网络流的相关文章

题解:线性规划与网络流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

[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教授的任务是找出一个有效算法,确定在

NYIST 531 太空飞行计划

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

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

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