点这里

题意: 题目大意就是问把000加工到111(多少个零视输入的P而定)的最大零件个数,并且输出路径。
  但是具体的加工规则真的是把我看晕了 然后我们来说说具体的加工规则:N台机器,每台机器能同时加工Q台电脑,并且都有输入、输出两端,两端都有P个参数。输入端有0、1、2三种状态,输出端都有0、1两种状态。例如第一个样例中的第一行15 0 0 0 0 1 0表示这台机器能同时加工15台电脑,并且能将状态为000的电脑加工成010。这里我尝试理解了很久才看懂 规则就是每台机器只能加工其输入端对应状态的电脑,并加工成其输出端的状态。特殊点在于输入端的状态2表示0或1都能处理。
  求最多同时能加工多少电脑,并且输出所有的加工路径。


题解: 因为P和N的范围都不大,所以用EK算法就能解决。实际上是我一开始用Dinic没写出来。 至于输出路径 ,只要复制一下一开始的图,跑完模板之后对比前后的图,容量减少的边都要输出。


#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 60;int p, n, w[N];
int in[N][12], out[N][12];
int pre[N], G[N][N], ori[N][N]; //记录前驱节点、存图
int bfs(int s, int t){int flow[N];      //到节点i的流量memset(pre, -1, sizeof pre);   //重置前驱节点flow[s] = inf; pre[s] = 0;        //源点的容量无限queue<int> Q; Q.push(s);while(!Q.empty()){int u = Q.front(); Q.pop();if(u == t)   break;for(int i = 1; i <= t; i++)if(i != s && G[u][i] > 0 && pre[i] == -1){    //保证i不是起点,i没有去过,i还有残留容量pre[i] = u;Q.push(i);flow[i] = min(flow[u], G[u][i]);}}return pre[t] == -1 ? -1 : flow[t];
}
int maxflow(int s, int t){int Maxflow = 0;while(1){int flow = bfs(s, t);if(flow == -1)  break;int cur = t;while(cur != s){int fa = pre[cur];G[fa][cur] -= flow;G[cur][fa] += flow;    //更新残留容量cur = fa;}Maxflow += flow;   //这条增广路的流量汇入汇点}return Maxflow;
}
void print_flow(){memcpy(ori, G, sizeof G);int res = maxflow(0, n + 1);int cnt = 0, ans[110][3];for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)if(ori[i][j] > G[i][j])ans[cnt][0] = i, ans[cnt][1] = j, ans[cnt++][2] = ori[i][j] - G[i][j];printf("%d %d\n", res, cnt);for(int i = 0; i < cnt; i++)    printf("%d %d %d\n", ans[i][0], ans[i][1], ans[i][2]);
}
int main(){while(~scanf("%d%d", &p, &n)){memset(G, 0, sizeof G);for(int i = 1; i <= n; i++){scanf("%d", w + i);for(int j = 1; j <= p; j++)   scanf("%d", in[i] + j);for(int j = 1; j <= p; j++)    scanf("%d", out[i] + j);}for(int i = 1; i <= n; i++){int f1 = 1, f2 = 1;for(int j = 1; j <= p; j++){if(in[i][j] == 1)  f1 = 0;if(out[i][j] == 0)    f2 = 0;}if(f1) G[0][i] = w[i];if(f2)  G[i][n + 1] = w[i];for(int j = 1; j <= n; j++){if(i == j)    continue;int flag = 1;for(int k = 1; k <= p; k++)   if(out[i][k] + in[j][k] == 1){   flag = 0;  break;}if(flag) G[i][j] = min(w[i], w[j]);}}print_flow();}return 0;
}

POJ3426 ACM Computer Factory——最大流(EK+输出路径)相关推荐

  1. pku 3436 ACM Computer Factory ——最大流 EK

    http://poj.org/problem?id=3436 题意好难懂,有n个工厂加工电脑半成品,半成品电脑需要p个部件. 输入p(需要的部件数) n(工厂数) Qi  (工厂最大生产量)  Si, ...

  2. POJ - 3436 ACM Computer Factory(最大流+输出残余网络)

    题目链接:点击查看 题目大意:给出n个机器以及m个零件,m个零件分别代表电脑上的零件,每一个机器可以将电脑上零件的一种状态转变为另一种状态,并且每个机器都有单独的效率,现在对于每一个单独的零件,规定状 ...

  3. POJ 3436 -- ACM Computer Factory(最大流,建图)

    题目链接 Description As you know, all the computers used for ACM contests must be identical, so the part ...

  4. ACM Computer Factory

    ACM Computer Factory 题目链接:http://poj.org/problem?id=3436 网络流Dinic 将一个机器拆分成两个点,这两个点之间的容量为机器的加工量:建立一个超 ...

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

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

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

    题意:有一个ACM工厂会生产一些电脑,在这个工厂里面有一些生产线,分别生产不同的零件,不过他们生产的电脑可能是一体机,所以只能一些零件加工后别的生产线才可以继续加工,比如产品A在生产线1号加工后继续前 ...

  7. POJ 3436 ACM Computer Factory

    传送门:https://vjudge.net/problem/POJ-3436 题目大意: 每台电脑由p个零件组成,编号1-n.生产电脑完全由N台全自动的机器完成.每台机器能够添加一些零件和移除一些电 ...

  8. poj3436——ACM Computer Factory

    题目大意: 输入: 输出: 分析: 代码:转载自

  9. 网络流——最大流EK算法讲解

    网络流--最大流EK算法讲解 好了,这是第二篇博客了,如第一篇所述,来讲一讲刚刚理解的网络流.因为本人只会EK算法,所以先讲这个算法.(我会去补知识点的!!!) 什么是网络流??? 读者们刚接触这个知 ...

最新文章

  1. C#获取指定坐标点像素,效率更高快
  2. virtaulbox视图模式常用切换
  3. AlphaZero进化论:从零开始,制霸所有棋类游戏
  4. nginx 学习笔记(3) nginx管理
  5. Windows路由表配置:双网卡同时上内外网
  6. ecplise常用快捷键
  7. 如何在Django1.6结合Python3.4版本中使用MySql
  8. Linux 命令之 tar 命令-打包和备份的归档工具(附压缩/解压工具)
  9. python教程自带数据库_python教程自带数据库 | Python学哪个数据库
  10. Python(17)-元组tuple
  11. TensorFlow多层感知机实现MINIST分类
  12. 正态分布的前世今生:正态魅影
  13. NP、OSPF监测调试
  14. nohup命令简单的使用
  15. 更好的图片压缩途径: WebP探索之路
  16. Laravel文档梳理2、路由相关
  17. 无线局域网技术分析及攻击实战
  18. C语言之strrchr函数
  19. 基于PYNQ的AD采集系统
  20. JavaScript 运算符与逻辑分支

热门文章

  1. 简单工厂模式、工厂方法模式与抽象工厂模式
  2. 21uec++多人游戏【AI联机】
  3. UltraEdit自动化脚本
  4. python斐波那契螺旋线怎么画向日葵心,【脑洞题】飞蛾扑火曲线—— 斐波那契螺旋线...
  5. Gateway网关的使用
  6. 多核机器上多线程内存敏感程序的可伸缩性
  7. 星形线再回顾--切线(点)构成曲线
  8. 移动宽带套餐介绍_移动宽带一年多少钱 2018移动宽带套餐介绍
  9. @Embedded 和 @Embeddable
  10. java同步,异步和阻塞,非阻塞的联系和区别