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

题意

懒得翻,找了个题意。

流水线上有N台机器装电脑,电脑有P个部件,每台机器有三个参数,产量,输入规格,输出规格;输入规格中0表示改部件不能有,1表示必须有,2无所谓;输出规格中0表示改部件没有,1表示有。问如何安排流水线(如何建边)使产量最高。

思路

建图如下



说一下为什么要拆点,若不拆点:

当每台机器节点的入度大于1且出度大于1时,经过这个节点的流量没法限制在容量下。

提交过程

AC

代码

  1. #include <queue>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. const int maxn=50+20, INF=1e8;
  7. struct Edge{
  8. int from,to,cap,flow;
  9. Edge(int u,int v,int c,int f):
  10. from(u), to(v), cap(c), flow(f) {}
  11. };
  12. struct Dinic{
  13. int n, m, s, t;
  14. vector<int> G[maxn];
  15. vector<Edge> edges;
  16. bool vis[maxn];
  17. int dep[maxn], cur[maxn];
  18. void init(int n){
  19. this->n=n;
  20. for (int i=0;i<=n;i++) G[i].clear();
  21. edges.clear();
  22. }
  23. void addEdge(int from, int to, int cap){
  24. edges.push_back(Edge(from, to, cap, 0));
  25. edges.push_back(Edge(to, from, 0, 0));
  26. m=edges.size();
  27. G[from].push_back(m-2);
  28. G[to].push_back(m-1);
  29. }
  30. bool bfs(void){
  31. memset(vis, false, sizeof(vis));
  32. queue<int> Q;
  33. vis[s]=true;
  34. dep[s]=0;
  35. Q.push(s);
  36. while(!Q.empty()){
  37. int x=Q.front(); Q.pop();
  38. for(int i=0;i<G[x].size();i++){
  39. Edge &e=edges[G[x][i]];
  40. if(!vis[e.to] && e.cap>e.flow){
  41. vis[e.to]=1;
  42. dep[e.to]=dep[x]+1;
  43. Q.push(e.to);
  44. }
  45. }
  46. }
  47. return vis[t];
  48. }
  49. int dfs(int x, int a){//a当前为止所有弧的最小残量
  50. if(x==t || a==0)return a;
  51. int flow=0, f;
  52. for(int &i=cur[x];i<G[x].size();i++) {//cur当前弧优化
  53. Edge &e=edges[G[x][i]];
  54. if(dep[e.to]==dep[x]+1 && (f=dfs(e.to, min(a, e.cap-e.flow)))>0){
  55. e.flow+=f;
  56. edges[G[x][i]^1].flow-=f;
  57. flow+=f;
  58. a-=f;
  59. if(a==0)break;
  60. }
  61. }
  62. return flow;
  63. }
  64. int maxFlow(int s, int t){
  65. this->s=s; this->t=t;
  66. int flow=0;
  67. while(bfs()){
  68. memset(cur, 0, sizeof(cur));
  69. flow+=dfs(s, INF);
  70. }
  71. return flow;
  72. }
  73. void bugs(void){
  74. for (int i=0; i<=n; i++){
  75. printf("%d: ", i);
  76. for (int j=0; j<G[i].size(); j++)
  77. if (edges[G[i][j]].cap!=0)
  78. printf("%d(%d) ", edges[G[i][j]].to, edges[G[i][j]].cap);
  79. printf("\n");
  80. }
  81. }
  82. void show(int st, int end){
  83. int from[maxn*maxn], to[maxn*maxn], flow[maxn*maxn];
  84. int size=0;
  85. int ans=maxFlow(0, 1);
  86. if (ans==0){
  87. printf("0 0\n");
  88. return;
  89. }
  90. for (int i=st; i<=end; i++){
  91. for (int j=0; j<G[i].size(); j++){
  92. Edge &e=edges[G[i][j]];
  93. if (e.cap==INF && e.flow>0 && e.from!=0 && e.to!=1){
  94. from[size]=e.from;
  95. to[size]=e.to;
  96. flow[size++]=e.flow;
  97. }
  98. }
  99. }
  100. printf("%d %d\n", ans, size);
  101. for (int i=0; i<size; i++)
  102. printf("%d %d %d\n", from[i]/2, to[i]/2, flow[i]);
  103. }
  104. }dinic;
  105. int n, m, in[maxn][15], out[maxn][15], cap[maxn];
  106. bool match(int j, int i){
  107. for (int k=0; k<m; k++)
  108. if (out[j][k]!=in[i][k] && in[i][k]!=2)
  109. return false;
  110. return true;
  111. }
  112. void makeGraph(void){
  113. for (int i=2; i<=n+1; i++){
  114. dinic.addEdge(i*2-2, i*2-1, cap[i]);
  115. for (int j=2; j<=n+1; j++) if (i!=j){
  116. if (match(j, i)) dinic.addEdge(j*2-1, i*2-2, INF);
  117. }
  118. if (match(0, i)) dinic.addEdge(0, i*2-2, INF);
  119. if (match(i, 1)) dinic.addEdge(i*2-1, 1, INF);
  120. }
  121. }
  122. int main(void){
  123. int from, to, tmp;
  124. while (scanf("%d%d", &m, &n)==2 && n){
  125. dinic.init(n*2+1);
  126. for (int i=0; i<m; i++) in[1][i]=1;
  127. for (int i=0; i<m; i++) out[0][i]=0;
  128. for (int i=2; i<=n+1; i++){
  129. scanf("%d", &cap[i]);
  130. for (int j=0; j<m; j++) scanf("%d", &in[i][j]);
  131. for (int j=0; j<m; j++) scanf("%d", &out[i][j]);
  132. }
  133. makeGraph();
  134. // dinic.bugs();
  135. dinic.show(2, n*2+1);
  136. }
  137. return 0;
  138. }
Time Memory Length Lang Submitted
208kB 3993 C++ 2018-08-17 04:42:53

POJ-3436 ACM Computer Factory 最大流 为何拆点的更多相关文章

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

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

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

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

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

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

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

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

  5. POJ - 3436 ACM Computer Factory 网络流

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

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

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

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

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

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

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

  9. POJ 3436 ACM Computer Factory

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

  10. kuangbin专题专题十一 网络流 POJ 3436 ACM Computer Factory

    题目链接:https://vjudge.net/problem/POJ-3436 Sample input 1 3 4 15 0 0 0 0 1 0 10 0 0 0 0 1 1 30 0 1 2 1 ...

随机推荐

  1. ABBYY FineReader双十一优惠享不停,战绩如何?

    随着双十一的火热来袭,购物达人也是不吝啬囊中票子,各种姿势剁手齐全,立誓过后吃土半月,双十一的好与不好?自己也是门清,反正真真的是促进消费了! 就ABBYYFineReader而言,此次的双十一力度就 ...

  2. 边框的使用,border-radius,box-shadow,border-image

    <html>    <head>        <meta charset="UTF-8">        <title></ ...

  3. Pyhton学习——Day8

    ###########################################max函数#################################################### ...

  4. 1、使用Python3爬取美女图片-网站中的每日更新一栏

    此代码是根据网络上其他人的代码优化而成的, 环境准备: pip install lxml pip install bs4 pip install urllib #!/usr/bin/env pytho ...

  5. Tensorflow学习笔记——Summary用法

    tensorboard 作为一款可视化神器,可以说是学习tensorflow时模型训练以及参数可视化的法宝. 而在训练过程中,主要用到了tf.summary()的各类方法,能够保存训练过程以及参数分布 ...

  6. python3编写登录接口

    #/usr/bin/env python#yehui'''作业一:博客 作业二:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定'''import getpass, os, pic ...

  7. [转载] C 陷阱与缺陷( C traps and Pitfalls )

    本文转自 https://www.xuebuyuan.com/1951579.html 自己找工作过程中复习过的书包括<C traps and Pitfalls>,<编程珠玑> ...

  8. [WPF,XAML] 跳动的心

    原文:[WPF,XAML] 跳动的心 没什么艺术细胞,原谅,原谅! <Canvas Width="0" Height="0"> <Canvas ...

  9. Codecademy网站安利 及 javaScript学习

    今天发现一个Code教学网站,号称可以利用零碎时间来学习些代码. codecademy (https://www.codecademy.com)

  10. MgdDbg工具

    ArxDbg是可以查看AutoCAD内部数据结构的工具,可惜是C++的.从网上找到了一个.NET版本的MgdDbg,实现的功能与C++版本的差不多. 1.运行程序,你只要右键点击AutoCAD窗口,在 ...