A - ACM Computer Factory POJ - 3436 网络流
A - ACM Computer Factory
As you know, all the computers used for ACM contests must be identical, so the participants compete on equal terms. That is why all these computers are historically produced at the same factory.
Every ACM computer consists of P parts. When all these parts are present, the computer is ready and can be shipped to one of the numerous ACM contests.
Computer manufacturing is fully automated by using N various machines. Each machine removes some parts from a half-finished computer and adds some new parts (removing of parts is sometimes necessary as the parts cannot be added to a computer in arbitrary order). Each machine is described by its performance (measured in computers per hour), input and output specification.
Input specification describes which parts must be present in a half-finished computer for the machine to be able to operate on it. The specification is a set of P numbers 0, 1 or 2 (one number for each part), where 0 means that corresponding part must not be present, 1 — the part is required, 2 — presence of the part doesn't matter.
Output specification describes the result of the operation, and is a set of Pnumbers 0 or 1, where 0 means that the part is absent, 1 — the part is present.
The machines are connected by very fast production lines so that delivery time is negligibly small compared to production time.
After many years of operation the overall performance of the ACM Computer Factory became insufficient for satisfying the growing contest needs. That is why ACM directorate decided to upgrade the factory.
As different machines were installed in different time periods, they were often not optimally connected to the existing factory machines. It was noted that the easiest way to upgrade the factory is to rearrange production lines. ACM directorate decided to entrust you with solving this problem.
Input
Input file contains integers P N, then N descriptions of the machines. The description of ith machine is represented as by 2 P + 1 integers Qi Si,1 Si,2...Si,PDi,1 Di,2...Di,P, where Qi specifies performance, Si,j — input specification for part j, Di,k — output specification for part k.
Constraints
1 ≤ P ≤ 10, 1 ≤ N ≤ 50, 1 ≤ Qi ≤ 10000
Output
Output the maximum possible overall performance, then M — number of connections that must be made, then M descriptions of the connections. Each connection between machines A and B must be described by three positive numbers A B W, where W is the number of computers delivered from A to B per hour.
If several solutions exist, output any of them.
Sample Input
- 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 1
- 3 0 2 1 1 1 1
- Sample input 2
- 3 5
- 5 0 0 0 0 1 0
- 100 0 1 0 1 0 1
- 3 0 1 0 1 1 0
- 1 1 0 1 1 1 0
- 300 1 1 2 1 1 1
- Sample input 3
- 2 2
- 100 0 0 1 0
- 200 0 1 1 1
Sample Output
- Sample output 1
- 25 2
- 1 3 15
- 2 3 10
- Sample output 2
- 4 5
- 1 3 3
- 3 5 3
- 1 2 1
- 2 4 1
- 4 5 1
- Sample output 3
- 0 0
Hint
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <string>
- #include <queue>
- #include <vector>
- #include <algorithm>
- #define inf 0x3f3f3f3f
- using namespace std;
- const int INF = 0x3f3f3f3f;
- const int maxn = 1e5 + ;
- struct edge
- {
- int u, v, c, f;
- edge(int u, int v, int c, int f) :u(u), v(v), c(c), f(f) {}
- };
- vector<edge>e;
- vector<int>G[maxn];
- int level[maxn];//BFS分层,表示每个点的层数
- int iter[maxn];//当前弧优化
- int m;
- void init(int n)
- {
- for (int i = ; i <= n; i++)G[i].clear();
- e.clear();
- }
- void add(int u, int v, int c)
- {
- e.push_back(edge(u, v, c, ));
- e.push_back(edge(v, u, , ));
- m = e.size();
- G[u].push_back(m - );
- G[v].push_back(m - );
- }
- void BFS(int s)//预处理出level数组
- //直接BFS到每个点
- {
- memset(level, -, sizeof(level));
- queue<int>q;
- level[s] = ;
- q.push(s);
- while (!q.empty())
- {
- int u = q.front();
- q.pop();
- for (int v = ; v < G[u].size(); v++)
- {
- edge& now = e[G[u][v]];
- if (now.c > now.f && level[now.v] < )
- {
- level[now.v] = level[u] + ;
- q.push(now.v);
- }
- }
- }
- }
- int dfs(int u, int t, int f)//DFS寻找增广路
- {
- if (u == t)return f;//已经到达源点,返回流量f
- for (int &v = iter[u]; v < G[u].size(); v++)
- //这里用iter数组表示每个点目前的弧,这是为了防止在一次寻找增广路的时候,对一些边多次遍历
- //在每次找增广路的时候,数组要清空
- {
- edge &now = e[G[u][v]];
- if (now.c - now.f > && level[u] < level[now.v])
- //now.c - now.f > 0表示这条路还未满
- //level[u] < level[now.v]表示这条路是最短路,一定到达下一层,这就是Dinic算法的思想
- {
- int d = dfs(now.v, t, min(f, now.c - now.f));
- if (d > )
- {
- now.f += d;//正向边流量加d
- e[G[u][v] ^ ].f -= d;
- //反向边减d,此处在存储边的时候两条反向边可以通过^操作直接找到
- return d;
- }
- }
- }
- return ;
- }
- int Maxflow(int s, int t)
- {
- int flow = ;
- for (;;)
- {
- BFS(s);
- if (level[t] < )return flow;//残余网络中到达不了t,增广路不存在
- memset(iter, , sizeof(iter));//清空当前弧数组
- int f;//记录增广路的可增加的流量
- while ((f = dfs(s, t, INF)) > )
- {
- flow += f;
- }
- }
- return flow;
- }
- int main()
- {
- int n, m;
- while(scanf("%d%d",&n,&m)!=EOF)//n是城市的数量,m是高速公路的数量
- {
- init(*n+);
- int s, t, x, y;
- scanf("%d%d", &s, &t);
- for(int i=;i<=n;i++)
- {
- scanf("%d", &x);
- add(i, i + n, x);
- }
- for(int i=;i<=m;i++)
- {
- scanf("%d%d", &x, &y);
- add(x + n, y, inf);
- add(y+n, x, inf);
- }
- int ans = Maxflow(s, t+n);
- printf("%d\n", ans);
- }
- return ;
- }
A - ACM Computer Factory POJ - 3436 网络流的更多相关文章
- ACM Computer Factory POJ - 3436 网络流拆点+路径还原
http://poj.org/problem?id=3436 每台电脑有$p$个组成部分,有$n$个工厂加工电脑. 每个工厂对于进入工厂的半成品的每个组成部分都有要求,由$p$个数字描述,0代表这个部 ...
- ACM Computer Factory - poj 3436 (最大流)
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5949 Accepted: 2053 Special Judge ...
- (网络流)ACM Computer Factory --POJ --3436
链接: http://poj.org/problem?id=3436 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82835#probl ...
- A - ACM Computer Factory - poj 3436(最大流)
题意:有一个ACM工厂会生产一些电脑,在这个工厂里面有一些生产线,分别生产不同的零件,不过他们生产的电脑可能是一体机,所以只能一些零件加工后别的生产线才可以继续加工,比如产品A在生产线1号加工后继续前 ...
- POJ 3436 ACM Computer Factory (网络流,最大流)
POJ 3436 ACM Computer Factory (网络流,最大流) Description As you know, all the computers used for ACM cont ...
- POJ 3436:ACM Computer Factory 网络流
ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6247 Accepted: 2 ...
- Poj 3436 ACM Computer Factory (最大流)
题目链接: Poj 3436 ACM Computer Factory 题目描述: n个工厂,每个工厂能把电脑s态转化为d态,每个电脑有p个部件,问整个工厂系统在每个小时内最多能加工多少台电脑? 解题 ...
- POJ 3464 ACM Computer Factory
ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4829 Accepted: 1641 ...
- POJ-3436 ACM Computer Factory(网络流EK)
As you know, all the computers used for ACM contests must be identical, so the participants compete ...
随机推荐
- tf.nn.softmax 分类
tf.nn.softmax(logits,axis=None,name=None,dim=None) 参数: logits:一个非空的Tensor.必须是下列类型之一:half, float32,fl ...
- Java的运行时数据存储机制
原文地址:http://yanwushu.sinaapp.com/java_data_storage/ Java程序在运行时需要为一系列的值或者对象分配内存,这些值都存在什么地方?用什么样的数据结构存 ...
- Java方法的重点
方法就是完成功能一个语句集合体 使用方法的原则:方法的原子性,一个方法只实现一个功能. 方法的重载 1.函数名必须相同 2.形参列表必须不同(可以是个数不同,类型不同,不然完全一样) 3.返回值可以相 ...
- 弹幕有点逗比,用 Python 爬下来看看《民国奇探》的弹幕
电视剧<民国奇探>是一部充斥着逗比风的探案剧,剧中主要角色:三土.四爷.白小姐,三土这个角色类似于<名侦探柯南>中的柯南但带有搞笑属性,四爷则类似于毛利小五郎但有大哥范且武功高 ...
- Pie 杭电1969 二分
My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I have a number N ...
- 5. react父子组件
1. 父组件如何获取子组件的方法以及属性? 1.)父组件: render( ){ console.log( this.refs.getmethod ): return ( <div> &l ...
- idea中哪些好用到飞起的插件,偷懒神器
idea中开发人员的偷懒神器-插件 本期推荐一些开发人员常用的一些idea插件.偷懒神器在此,不再秃头! 1. idea安装插件的方法. file->setting->plugins ...
- 《Spring In Action》阅读笔记之装配bean
Spring主要装配机制 1.在XML中进行显式配置 2.在Java中进行显式配置 3.隐式的的bean发现机制和自动装配 自动化装配bean Spring从两个角度来实现自动化装配 1.组件扫描:S ...
- 在Eclipse上实现简单的JDBC增删查改操作
在Javaweb的学习里,学到了如何完成简单的增删查改操作,在这里撰写一篇文章以便自己整理回忆. 首先要建立一些包和导入一些文件.建一些类.具体框架如图 编写Product类 public clas ...
- 2019-2020-1 20199308《Linux内核原理与分析》第九周作业
<Linux内核分析> 第八章 可执行程序工作原理进程的切换和系统的一般执行过程 8.1 知识点 进程调度的时机 ntel定义的中断类型主要有以下几种 硬中断(Interrupt) 软中断 ...