【PowerOJ1737&网络流24题】太空飞行计划问题(最小割)

题意:

思路:

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef long long ll;
  4 typedef unsigned int uint;
  5 typedef unsigned long long ull;
  6 typedef long double ld;
  7 typedef pair<int,int> PII;
  8 typedef pair<ll,ll> Pll;
  9 typedef vector<int> VI;
 10 typedef vector<PII> VII;
 11 //typedef pair<ll,ll>P;
 12 #define N  200010
 13 #define M  200010
 14 #define INF 1e9
 15 #define fi first
 16 #define se second
 17 #define MP make_pair
 18 #define pb push_back
 19 #define pi acos(-1)
 20 #define mem(a,b) memset(a,b,sizeof(a))
 21 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
 22 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
 23 #define lowbit(x) x&(-x)
 24 #define Rand (rand()*(1<<16)+rand())
 25 #define id(x) ((x)<=B?(x):m-n/(x)+1)
 26 #define ls p<<1
 27 #define rs p<<1|1
 28
 29 const ll MOD=1e9+7,inv2=(MOD+1)/2;
 30       double eps=1e-6;
 31       int dx[4]={-1,1,0,0};
 32       int dy[4]={0,0,-1,1};
 33
 34 int head[N],vet[N],len[N],nxt[N],dis[N],s,S,T,tot;
 35
 36 int read()
 37 {
 38    int v=0,f=1;
 39    char c=getchar();
 40    while(c<48||57<c) {if(c==‘-‘) f=-1; c=getchar();}
 41    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
 42    return v*f;
 43 }
 44
 45 void add(int a,int b,int c)
 46 {
 47     nxt[++tot]=head[a];
 48     vet[tot]=b;
 49     len[tot]=c;
 50     head[a]=tot;
 51
 52     nxt[++tot]=head[b];
 53     vet[tot]=a;
 54     len[tot]=0;
 55     head[b]=tot;
 56 }
 57
 58 bool bfs( )
 59 {
 60     queue<int>q;
 61     rep(i,1,s) dis[i]=-1;
 62     q.push(S),dis[S]=0;
 63     while(!q.empty())
 64     {
 65         int u=q.front();
 66         q.pop();
 67         int e=head[u];
 68         while(e)
 69         {
 70             int v=vet[e];
 71             if(len[e]>0&&dis[v]==-1)
 72             {
 73                 dis[v]=dis[u]+1;
 74                 q.push(v);
 75             }
 76             e=nxt[e];
 77         }
 78     }
 79     return dis[T]!=-1;
 80 }
 81
 82 int dfs(int u,int aug)
 83 {
 84     if(u==T) return aug;
 85     int e=head[u],val=0,flow=0;
 86     while(e)
 87     {
 88         int v=vet[e];
 89         if(len[e]>0&&dis[v]==dis[u]+1)
 90         {
 91             int t=dfs(v,min(len[e],aug));
 92             if(!t)
 93             {
 94                 e=nxt[e];
 95                 continue;
 96             }
 97             flow+=t;
 98             aug-=t;
 99             len[e]-=t;
100             len[e^1]+=t;
101             if(!aug) break;
102         }
103         e=nxt[e];
104     }
105     if(!flow) dis[u]=-1;
106     return flow;
107 }
108
109 int main()
110 {
111     int n=read(),m=read();
112     s=n+m;
113     S=++s,T=++s;
114     rep(i,1,s) head[i]=0;
115     tot=1;
116     int ans=0;
117     rep(i,1,n)
118     {
119         int x;
120         scanf("%d",&x);
121         add(S,i,x);
122         ans+=x;
123         while(getchar()==‘ ‘)
124         {
125             scanf("%d",&x);
126             add(i,x+n,INF);
127         }
128     }
129     rep(i,1,m)
130     {
131         int x=read();
132         add(i+n,T,x);
133     }
134     int tmp=0;
135     while(bfs()) tmp+=dfs(S,INF);
136     ans-=tmp;
137     rep(i,1,n)
138      if(dis[i]!=-1) printf("%d ",i);
139     printf("\n");
140     rep(i,1,m)
141      if(dis[i+n]!=-1) printf("%d ",i);
142     printf("\n");
143     printf("%d\n",ans);
144     return 0;
145 }

原文地址:https://www.cnblogs.com/myx12345/p/11743559.html

时间: 2024-12-18 22:35:17

【PowerOJ1737&网络流24题】太空飞行计划问题(最小割)的相关文章

[网络流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题] 太空飞行计划(cogs 727)

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

[网络流24题]太空飞行计划问题

Description $W$教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业 性实验而获取利润.现已确定了一个可供选择的实验集合$E={E_1,E_2,...,E_m}$,和进行这些实验需要使用的全部仪器的集合$I={I_1,I_2,...,I_n}$.实验$E_j$需要用到的仪器是$I$的子集$R_j\;\in\;I$.配置仪器$I_k$的费用为$c_k$美元.实验$E_j$的赞助商已同意为该实验结果支付$p_j$美元.$W$教授的任务是确定在一次太空飞行中要进行哪些

[luogu2762] [网络流24题] 太空飞行计划问题

传送门 一道最大权闭合子图的题目.直接建图跑dinic就行了,答案为正权点-最大流. 那剩下的问题就是如果知道哪些点被选进最大权闭合子图. 我们知道一个简单割对应了一个闭合子图,当这个简单割是最小割,即最大流,其与\(s\)相关的点即为闭合子图. #include <queue> #include <cstdio> #include <cstring> #include <algorithm> #define MAXN 105 #define INF 214

网络流 24题 太空飞行问题

太空飞行计划 题目描述 输入格式 文件第1行有2个正整数m和n.m是实验数,n是仪器数.接下来的m行,每行是一个实验的有关数据.第一个数赞助商同意支付该实验的费用:接着是该实验需要用到的若干仪器的编号.最后一行的n个数是配置每个仪器的费用.(1<=n, m<=50) 输出格式 第1行是实验编号:第2行是仪器编号:最后一行是净收益. 输入样例 23 10 1 2 25 2 3 5 6 7 输出样例 2209.out 12 1 2 3 17 关于这题的吐槽:     最坑的不是构图or输出方案,这

LiberOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流

#6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 在一个有 m×n m \times nm×n 个方格的棋盘中,每个方格中有一个正整数. 现要从方格中取数,使任意 2 22 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. 输入格式 文件第 1 11 行有 2 22 个正整数 m mm 和 n nn,分别表示棋盘的行数和列数

线性规划与网络流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题】餐巾计划(图解)

LOJ 6008[网络流24题]餐巾计划 题解 一张图片说明建图方法: 解说: 这种建图方法完美区分开了"脏餐巾"和"干净餐巾"两种餐巾. 每天一定会有r[i]个脏餐巾,所以源点向每天的"脏餐巾"(图上used)连边,容量r[i],费用是0.另外,前一天的脏餐巾也可以留到下一天再处理,所以每天的used点向下一天的used点连一条边,容量INF,费用是0. 每天会需要r[i]个干净餐巾,所以每天的"干净餐巾"向汇点连边(图上n

【网络流24题】餐巾计划问题(最小费用最大流)

[网络流24题]餐巾计划问题(最小费用最大流) 题面 COGS 洛谷上的数据范围更大,而且要开longlong 题解 餐巾的来源分为两种: ①新买的 ②旧的拿去洗 所以,两种情况分别建图 先考虑第一种 因为新买餐巾没有任何限制,并且随时可以买 所以直接从源点向每一天连边,容量为INF,费用为餐巾的价格 因为流要流出去,所以每个点向汇点连边,容量为每天的用量,费用为0 第二种,旧的拿去洗 首先考虑一下怎么算有多少旧的餐巾 每天用旧的餐巾的数量值一定的,不可能变多 因此从源点向这些点连边,容量为每天

LOJ #6008. 「网络流 24 题」餐巾计划

#6008. 「网络流 24 题」餐巾计划 题目描述 一个餐厅在相继的 n nn 天里,每天需用的餐巾数不尽相同.假设第 i ii 天需要 ri r_ir?i?? 块餐巾.餐厅可以购买新的餐巾,每块餐巾的费用为 P PP 分:或者把旧餐巾送到快洗部,洗一块需 M MM天,其费用为 F FF 分:或者送到慢洗部,洗一块需 N NN 天,其费用为 S SS 分(S<F S < FS<F). 每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗.