题目链接:https://vjudge.net/problem/POJ-3436

  1. Sample input 1
  2. 3 4
  3. 15 0 0 0 0 1 0
  4. 10 0 0 0 0 1 1
  5. 30 0 1 2 1 1 1
  6. 3 0 2 1 1 1 1

题目:P  —— 一台电脑由p个零件组成

   N —— 工厂有n台加工组装电脑的机器

  1.   Q —— i-th机器每单位时间能工作的数量
     
    当每个未成品需要放入某个机器进一步加工的时候,它需要满足这台机器能正常工作的前提,
    即它必须满足某些零件已经组装好了。
    样例1 p个数字表示,进入i-th台机器,必须满足这些条件(0表示这个零件不能被安装 1表示这个零件必须被安装 2表示这个零件有无被安装无影响)
    p个数字表示,某个未成品被i-th台机器加工完成后,满足了这些条件(0表示这个零件没被安装 1表示这个零件被安装了)
    问:怎么安排机器工作方案,能使得工作效率最大化,安排情况有很多,输出一种即可。
  2.  
  3. 思路:比较清楚,一个超级源点,一个超级汇点,一台机器需要拆成入点和出点,一台机器的入点和出点流量为该机器单位时间的工作量,其他点与点之间的流量就是INF了。
    重点就是哪些边能建立起来比较麻烦,图建好了,跑一个DinicOK了。
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <queue>
  5. #include <vector>
  6. using namespace std;
  7.  
  8. const int N = ,INF = (int)1e9;
  9. int p,n,tot;
  10. int G[N][N],head[N],lev[N];
  11. queue<int > que;
  12. struct info{
  13. int in[],out[];
  14. int cap;
  15. }info[N];//存机器的信息
  16. struct node{
  17. int to,nxt,flow;
  18. }e[N*N];
  19.  
  20. void init_main(){
  21. for(int i = ; i <= n; ++i)
  22. for(int j = ; j <= n; ++j) G[i][j] = ;
  23.  
  24. for(int i = ; i <= *n+; ++i) head[i] = -; tot = ;
  25. }
  26.  
  27. void init_bfs(){
  28. for(int i = ; i <= *n+; ++i) lev[i] = ;
  29. while(!que.empty()) que.pop();
  30. }
  31.  
  32. inline void add(int u,int v,int flow){
  33. e[tot].to = v;
  34. e[tot].flow = flow;
  35. e[tot].nxt = head[u];
  36. head[u] = tot++;
  37. }
  38.  
  39. //是否可连边
  40. inline bool check(int x,int y){
  41. for(int i = ; i <= p; ++i){
  42. if(info[y].in[i] == ) continue;
  43. if(info[x].out[i] != info[y].in[i]) return false;
  44. }
  45. return true;
  46. }
  47.  
  48. //建边
  49. void rebuild(){
  50. for(int i = ; i <= n; ++i){
  51. if(check(,i)){
  52. add(,i,INF); add(i,,);
  53. }
  54. if(check(i,*n+)){
  55. add(i+n,*n+,INF); add(*n+,i+n,);
  56. }
  57. }
  58. for(int i = ; i <= n; ++i){
  59. for(int j = ; j <= n; ++j){
  60. if(i == j){
  61. add(i,i+n,info[i].cap); add(i+n,i,);
  62. }
  63. else if(check(i,j)){
  64. add(i+n,j,INF); add(j,i+n,);
  65. }
  66. }
  67. }
  68. }
  69.  
  70. int dfs(int now,int flow,int t){
  71. if(now == t) return flow;
  72. int to,sum = ,tmp = ;
  73. for(int o = head[now]; ~o; o = e[o].nxt){
  74. to = e[o].to;
  75. if((lev[to] == lev[now] +) && e[o].flow && (tmp = dfs(to,min(flow - sum, e[o].flow),t))){
  76. //需要的路径流量 G数组来存机器之间的联系
  77. if(now > n && now < *n+ && to != *n+){
  78. G[now-n][to] += tmp;
  79. }
  80. e[o].flow -= tmp;
  81. e[o^].flow += tmp;
  82. if((sum += tmp) == flow) return sum;
  83. }
  84. }
  85. return sum;
  86. }
  87.  
  88. bool bfs(int s,int t){
  89. init_bfs();
  90. que.push();
  91. while(!que.empty()){
  92. int now = que.front(); que.pop();
  93. for(int o = head[now]; ~o; o = e[o].nxt){
  94. int to = e[o].to;
  95. if(!lev[to] && e[o].flow){
  96. lev[to] = lev[now] + ;
  97. que.push(to);
  98. }
  99. }
  100. }
  101. if(lev[t]) return true;
  102. else return false;
  103. }
  104.  
  105. int mf(int s,int t){
  106. int max_flow = ;
  107. while(bfs(s,t)){
  108. max_flow += dfs(s,INF,t);
  109. //cout << "max_flow " << max_flow << endl;
  110. }
  111. return max_flow;
  112. }
  113.  
  114. int main(){
  115.  
  116. while(~scanf("%d%d",&p,&n)){
  117. init_main();
  118. //读入信息 0超级源点 2*n+1超级汇点
  119. for(int i = ; i <= n; ++i){
  120. scanf("%d",&info[i].cap);
  121. for(int j = ; j <= p; ++j) scanf("%d",&info[i].in[j]);
  122. for(int j = ; j <= p; ++j) scanf("%d",&info[i].out[j]);
  123. }
  124. info[].cap = INF; info[*n+].cap = INF;
  125. for(int i = ; i <= p; ++i){
  126. info[].out[i] = ;
  127. info[*n+].in[i] = ;
  128. }
  129. //建图
  130. rebuild();
  131. //Dinic
  132. int _mf = mf(,*n+),line = ;
  133. //统计需要的联系数量
  134. for(int i = ; i <= n; ++i){
  135. for(int j = ; j <= n; ++j){
  136. if(G[i][j]) ++line;
  137. }
  138. }
  139. printf("%d %d\n",_mf,line);
  140. //输出联系
  141. for(int i = ; i <= n; ++i){
  142. for(int j = ; j <= n; ++j){
  143. if(G[i][j]) printf("%d %d %d\n",i,j,G[i][j]);
  144. }
  145. }
  146. }
  147.  
  148. return ;
  149. }
  1.  

kuangbin专题专题十一 网络流 POJ 3436 ACM Computer Factory的更多相关文章

  1. POJ 3436 ACM Computer Factory (网络流,最大流)

    POJ 3436 ACM Computer Factory (网络流,最大流) Description As you know, all the computers used for ACM cont ...

  2. Poj 3436 ACM Computer Factory (最大流)

    题目链接: Poj 3436 ACM Computer Factory 题目描述: n个工厂,每个工厂能把电脑s态转化为d态,每个电脑有p个部件,问整个工厂系统在每个小时内最多能加工多少台电脑? 解题 ...

  3. POJ - 3436 ACM Computer Factory 网络流

    POJ-3436:http://poj.org/problem?id=3436 题意 组配计算机,每个机器的能力为x,只能处理一定条件的计算机,能输出特定的计算机配置.进去的要求有1,进来的计算机这个 ...

  4. POJ 3436 ACM Computer Factory 最大流,拆点 难度:1

    题目 http://poj.org/problem?id=3436 题意 有一条生产线,生产的产品共有p个(p<=10)零件,生产线上共有n台(n<=50)机器,每台机器可以每小时加工Qi ...

  5. POJ - 3436 ACM Computer Factory(最大流)

    https://vjudge.net/problem/POJ-3436 题目描述:  正如你所知道的,ACM 竞赛中所有竞赛队伍使用的计算机必须是相同的,以保证参赛者在公平的环境下竞争.这就是所有这些 ...

  6. POJ 3436 ACM Computer Factory(最大流+路径输出)

    http://poj.org/problem?id=3436 题意: 每台计算机包含P个部件,当所有这些部件都准备齐全后,计算机就组装完成了.计算机的生产过程通过N台不同的机器来完成,每台机器用它的性 ...

  7. POJ 3436 ACM Computer Factory (拆点+输出解)

    [题意]每台计算机由P个零件组成,工厂里有n台机器,每台机器针对P个零件有不同的输入输出规格,现在给出每台机器每小时的产量,问如何建立流水线(连接各机器)使得每小时生产的计算机最多. 网络流的建图真的 ...

  8. POJ 3436 ACM Computer Factory

    题意:   为了追求ACM比赛的公平性,所有用作ACM比赛的电脑性能是一样的,而ACM董事会专门有一条生产线来生产这样的电脑,随着比赛规模的越来越大,生产线的生产能力不能满足需要,所以说ACM董事会想 ...

  9. poj 3436 ACM Computer Factory 最大流+记录路径

    题目 题意: 每一个机器有一个物品最大工作数量,还有一个对什么物品进行加工,加工后的物品是什么样.给你无限多个初始都是000....的机器,你需要找出来经过这些机器操作后最多有多少成功的机器(111. ...

随机推荐

  1. js实现instanceof

        instanceof 是通过原型链判断的,A instanceof B, 在A的原型链中层层查找,是否有原型等于B.prototype,如果一直找到A的原型链的顶端null,仍然不等于B.pr ...

  2. Jquery Validate表单验证,动态添加和删除验证规则

    最近一直在忙着维护Jquery的商城,用到了Validate的表单验证,觉得很有意思,就纪录一下. // 动态添加验证规则 $("#invoice_send_region_id") ...

  3. 【49.23%】【hdu 1828】Picture

    Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  4. webpack 命令

    --content-base <file/directory/url/port>:内容的路径. --quiet: 在控制台不输出任何内容 --no-info: 抑制无聊的信息 --colo ...

  5. 初识Contiv

    Contiv是一个用于跨虚拟机.裸机.公有云或私有云的异构容器部署的开源容器网络架构.作为业界最强大的容器网络架构,Contiv具有2层.3层.overlay和ACI模式,能够与思科基础设施进行本地集 ...

  6. Android生命周期函数执行顺序

    转载自:http://blog.csdn.net/intheair100/article/details/39061473 程序正常启动:onCreate()->onStart()->on ...

  7. win7+oracle11,vmbox中winxp连接

    重启TNSLSNR  打开CMD,输入以下命令. lsnrctl stop lsnrctl start lsnrctl stat /////////////////////////////////// ...

  8. 如何把对象手动注入Spring容器并实现依赖注入

    将对象注入到Spring容器并实现依赖注入 public class UserDao { @Resource AccountService accountService; public void pr ...

  9. mysql主从之主机名导致主从机制失败的问题

    一 主库 mysql主服务器的正确配置需要指定log-bin.log-bin-index server-id = 1 log-bin=master-bin log-bin-index = master ...

  10. DRF框架中分页功能接口

    目录 DRF框架中分页功能接口 DRF框架中分页功能接口 一.在框架中提供来三个类来实现分页功能,PageNumberPagination.LimitOffsetPagination.CursorPa ...