题意:给了n个工厂,m个商店,每个商店只有在要求的工厂都建好后才能获得利润,而建一个工厂需要花费和时间,现在问你能获得利润至少为l的最短时间是多少,在这个时间下的最大利润是多少;

题解:因为每一个商店盈利都必须有一些工厂修好。这就是一个闭合图的暗示!

闭合图论文以及证明

闭合图:一个有向图的子点集,使其中的点的出边都指回集合中的点,则称此为闭合图。

最大权闭合图:给每个点赋上点权,则权和最大的闭合图,为最大权闭合图。

算法(求最大权闭合子图):

(1)新增源点和汇点s,t

(2)对于原图中的边u->v,增加一条u->v的容量为无穷大的边

(3)对于点u,如果w[u]>0,增加一条s->u的容量为w[u]的边;否则增加一条u->v的容量为-w[u]的边

定义一个割划分出的S集合为一个解,那么割集的容量之和就是(未被选的A集合中的顶点的权值 + 被选的B集合中的顶点的权值),记为Cut。A集合中所有顶点的权值之和记为Total,那么Total - Cut就是(被选的A集合中的顶点的权值 - 被选的B集合中的顶点的权值),即为我们的目标函数,记为A。要想最大化目标函数A,就要尽可能使Cut小,Total是固定值,所以目标函数A取得最大值的时候,Cut最小,即为最小割。

用途:闭合图的性质恰好反映了事件之间的必要条件的关系:一个事件发生,它需要的所有前提都要发生。

所以这一题是一样的思路,对应的去建边就好了。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<string>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f;
const ll INFF=0x3f3f3f3f3f3f3f3f;
const ll mod=1e9+7;
const double pi=acos(-1.0);
const double eps=1e-9;
int level[201010];
int iter[201010];
struct node
{int x,y,c,rev;
};
vector<node>vec[201010];
void add_edge(int x,int y,int c)
{node p1,p2;p1.y=y,p1.c=c,p1.rev=vec[y].size();vec[x].push_back(p1);p2.y=x,p2.c=0,p2.rev=vec[x].size()-1;vec[y].push_back(p2);
}
void bfs(int s)
{memset(level,-1,sizeof(level));queue<int>q;level[s]=0;q.push(s);while(!q.empty()){int v=q.front();q.pop();for(int i=0;i<vec[v].size();i++){node p=vec[v][i];if(p.c>0&&level[p.y]<0){level[p.y]=level[v]+1;q.push(p.y);}}}
}
int dfs(int v,int t,int f)
{if(v==t)return f;for(int &i=iter[v];i<vec[v].size();i++){node &p=vec[v][i];if(p.c>0&&level[v]<level[p.y]){int d=dfs(p.y,t,min(f,p.c));if(d>0){p.c-=d;vec[p.y][p.rev].c+=d;return d;}}}return 0;
}
int max_flow(int s,int t)
{int ans=0;for(;;){bfs(s);if(level[t]<0)return ans;memset(iter,0,sizeof(iter));int f;while((f=dfs(s,t,INF))>0)ans+=f;}
}
int cost[205],time[205];
int GET[205],num[205],dic[205][205];
int main()
{int t;scanf("%d",&t);for(int vv=1;vv<=t;vv++){int n,m,L;scanf("%d%d%d",&n,&m,&L);for(int i=1;i<=n;i++)scanf("%d%d",&cost[i],&time[i]);for(int i=1;i<=m;i++){scanf("%d%d",&GET[i],&num[i]);for(int j=1;j<=num[i];j++)scanf("%d",&dic[i][j]);}int l=0,r=INF;int anst=-1,ansg=0;while(r>=l){int mid=(l+r)/2;for(int i=0;i<=n+m+10;i++)vec[i].clear();for(int i=1;i<=n;i++){if(mid>=time[i])add_edge(0,i,cost[i]);else add_edge(0,i,INF);}int sum=0;for(int i=1;i<=m;i++){for(int j=1;j<=num[i];j++)add_edge(dic[i][j],i+n,INF);add_edge(i+n,n+m+1,GET[i]);sum+=GET[i];}int ss=max_flow(0,n+m+1);if(sum-ss>=L){anst=mid;ansg=sum-ss;r=mid-1;}else{l=mid+1;}}printf("Case #%d: ",vv);if(anst!=-1)printf("%d %d\n",anst,ansg);elseputs("impossible");}return 0;
}

HDU5855(最大权闭合图构图技巧+裸的最大流)相关推荐

  1. 洛谷 - P2762 太空飞行计划问题(最大权闭合图+路径打印)

    题目链接:点击查看 题目大意:给出n个实验,每个实验完成之后都可以得到一定的奖金,但每个实验需要特殊的器械才可以完成,准备器械又需要一定的支出,现在问如何选择实验才能让利润最大化,并输出需要选择的实验 ...

  2. 【洛谷 - P3410】拍照(最大权闭合图,网络流最小割)

    题干: 题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. 注意:带下属不 ...

  3. luogu P3410 拍照(最大权闭合图转最小割)

    luogu P3410 拍照 最大权闭合图转最小割 要得到最大收益,我们可以用总可能收益减去最小花费,也就是最小割. #include<cstdio> #include<cstrin ...

  4. 【网络流24题】B、太空飞行计划问题(最大权闭合图转最小割、最小割方案输出)

    整理的算法模板合集: ACM模板 B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] P2762 太空飞行计划问题 [问题分析] 最大权闭合图问题,可以转化成最小割问题, ...

  5. 【bzoj1565】[NOI2009]植物大战僵尸 拓扑排序+最大权闭合图

    原文地址:http://www.cnblogs.com/GXZlegend/p/6808268.html 题目描述 输入 输出 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何 ...

  6. POJ 2987 Firing(最大权闭合图)

    [题目链接] http://poj.org/problem?id=2987 [题目大意] 为了使得公司效率最高,因此需要进行裁员, 裁去不同的人员有不同的效率提升效果,当然也有可能是负的效果, 如果裁 ...

  7. 最大权闭合 图 讲解

    详见  国家集训队 论文 2007  胡伯涛 <最小割模型在信息学竞赛中的应用> 首先说几个我看时疑惑的问题   1:为什么 割里面的点集就是闭合 图 ? 答:由于 我们见图时,将原图的 ...

  8. Bzoj 1391: [Ceoi2008]order 网络流,最大权闭合图

    1391: [Ceoi2008]order Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1105  Solved: 331 [Submit][Sta ...

  9. POJ - 2987 Firing(最大权闭合图)

    题目链接:点击查看 题目大意:某公司想要裁员,裁员的标准是如果某人被裁,那么其下属也会被裁,依此类推,每一个人都有一个贡献度,问怎样裁员才能使得最后的贡献度最大并且裁掉人数最少 题目分析:最大权闭合图 ...

  10. 最大权闭合图hdu3996

    定义:最大权闭合图:是有向图的一个点集,且该点集的所有出边都指向该集合.即闭合图内任意点的集合也在改闭合图内,给每个点分配一个点权值Pu,最大权闭合图就是使闭合图的点权之和最大. 最小割建边方式:源点 ...

最新文章

  1. 将***拒之门外 设置电脑防止******
  2. Hadoop3.0基础平台搭建(三节点),以及案例运行并使用python生成词云
  3. Java中的内存划分
  4. Linux中的基础IO(二)
  5. Rust核心团队前成员Brian Anderson加入PingCAP
  6. go 获取屏幕分辨率_CS:GO枪神的自我修养 高刷电竞显示器推荐
  7. ios -- 极光推送《2》--极光推送消息推送成功,但是手机收不到的解决方法
  8. 【pandas教程】索引操作
  9. Python调试工具——ipdb
  10. 【晶体管电路设计】一、晶体管设计概述与共射极放大电路
  11. 2021年京东/淘宝/天猫/双十一红包最新优惠攻略,1111超级红包如何抢?
  12. ubuntu系统瘦身-清理系统垃圾文件
  13. Word文档转换:如何使用Aspose.words在Java中将Word和图像转换为PDF
  14. 【python爬虫】爬取《英雄联盟》英雄及皮肤图片数据
  15. 解决mysql存储特殊文字(表情符号)utf8mb4
  16. 吴恩达-DeepLearning.ai-05 序列模型(一)
  17. Unirech:为什么不能访问阿里云国际版云服务器ecs实例上的网站
  18. 青岛科技大学计算机专硕拟录取分数,青岛科技大学2018年硕士研究生第一批拟录取名单公示...
  19. 三菱FX3U PLC模拟量输入FB(FX2N-2AD)
  20. 油菜花系统服务器能删除内容吗,油菜花能吃吗,油菜花有什么用

热门文章

  1. 采样频率Hz 采样率KSPS或MSPS,两种单位的换算关系
  2. matlab 采样点数,信号频率、采样频率、采样点数
  3. python实现定时任务的8种方式详解
  4. Java获取本机外网ip地址的方法
  5. EasyUI filebox 限制文件上传的类型
  6. BZOJ3420: Poi2013 Triumphal arch
  7. aka名字_想给Aka征集一个中文名字
  8. Eclipse常用便捷设置
  9. HTML动漫设计公司响应式网站模板期末大作业0023
  10. 练习4闭合导线平差计算