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 1
- 3 0 2 1 1 1 1
题目:P —— 一台电脑由p个零件组成
N —— 工厂有n台加工组装电脑的机器
- Q —— i-th机器每单位时间能工作的数量
当每个未成品需要放入某个机器进一步加工的时候,它需要满足这台机器能正常工作的前提,
即它必须满足某些零件已经组装好了。
样例1: 前p个数字表示,进入i-th台机器,必须满足这些条件(0表示这个零件不能被安装 1表示这个零件必须被安装 2表示这个零件有无被安装无影响)
后p个数字表示,某个未成品被i-th台机器加工完成后,满足了这些条件(0表示这个零件没被安装 1表示这个零件被安装了)
问:怎么安排机器工作方案,能使得工作效率最大化,安排情况有很多,输出一种即可。- 思路:比较清楚,一个超级源点,一个超级汇点,一台机器需要拆成入点和出点,一台机器的入点和出点流量为该机器单位时间的工作量,其他点与点之间的流量就是INF了。
重点就是哪些边能建立起来比较麻烦,图建好了,跑一个Dinic就OK了。
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <queue>
- #include <vector>
- using namespace std;
- const int N = ,INF = (int)1e9;
- int p,n,tot;
- int G[N][N],head[N],lev[N];
- queue<int > que;
- struct info{
- int in[],out[];
- int cap;
- }info[N];//存机器的信息
- struct node{
- int to,nxt,flow;
- }e[N*N];
- void init_main(){
- for(int i = ; i <= n; ++i)
- for(int j = ; j <= n; ++j) G[i][j] = ;
- for(int i = ; i <= *n+; ++i) head[i] = -; tot = ;
- }
- void init_bfs(){
- for(int i = ; i <= *n+; ++i) lev[i] = ;
- while(!que.empty()) que.pop();
- }
- inline void add(int u,int v,int flow){
- e[tot].to = v;
- e[tot].flow = flow;
- e[tot].nxt = head[u];
- head[u] = tot++;
- }
- //是否可连边
- inline bool check(int x,int y){
- for(int i = ; i <= p; ++i){
- if(info[y].in[i] == ) continue;
- if(info[x].out[i] != info[y].in[i]) return false;
- }
- return true;
- }
- //建边
- void rebuild(){
- for(int i = ; i <= n; ++i){
- if(check(,i)){
- add(,i,INF); add(i,,);
- }
- if(check(i,*n+)){
- add(i+n,*n+,INF); add(*n+,i+n,);
- }
- }
- for(int i = ; i <= n; ++i){
- for(int j = ; j <= n; ++j){
- if(i == j){
- add(i,i+n,info[i].cap); add(i+n,i,);
- }
- else if(check(i,j)){
- add(i+n,j,INF); add(j,i+n,);
- }
- }
- }
- }
- int dfs(int now,int flow,int t){
- if(now == t) return flow;
- int to,sum = ,tmp = ;
- for(int o = head[now]; ~o; o = e[o].nxt){
- to = e[o].to;
- if((lev[to] == lev[now] +) && e[o].flow && (tmp = dfs(to,min(flow - sum, e[o].flow),t))){
- //需要的路径流量 G数组来存机器之间的联系
- if(now > n && now < *n+ && to != *n+){
- G[now-n][to] += tmp;
- }
- e[o].flow -= tmp;
- e[o^].flow += tmp;
- if((sum += tmp) == flow) return sum;
- }
- }
- return sum;
- }
- bool bfs(int s,int t){
- init_bfs();
- que.push();
- while(!que.empty()){
- int now = que.front(); que.pop();
- for(int o = head[now]; ~o; o = e[o].nxt){
- int to = e[o].to;
- if(!lev[to] && e[o].flow){
- lev[to] = lev[now] + ;
- que.push(to);
- }
- }
- }
- if(lev[t]) return true;
- else return false;
- }
- int mf(int s,int t){
- int max_flow = ;
- while(bfs(s,t)){
- max_flow += dfs(s,INF,t);
- //cout << "max_flow " << max_flow << endl;
- }
- return max_flow;
- }
- int main(){
- while(~scanf("%d%d",&p,&n)){
- init_main();
- //读入信息 0超级源点 2*n+1超级汇点
- for(int i = ; i <= n; ++i){
- scanf("%d",&info[i].cap);
- for(int j = ; j <= p; ++j) scanf("%d",&info[i].in[j]);
- for(int j = ; j <= p; ++j) scanf("%d",&info[i].out[j]);
- }
- info[].cap = INF; info[*n+].cap = INF;
- for(int i = ; i <= p; ++i){
- info[].out[i] = ;
- info[*n+].in[i] = ;
- }
- //建图
- rebuild();
- //Dinic
- int _mf = mf(,*n+),line = ;
- //统计需要的联系数量
- for(int i = ; i <= n; ++i){
- for(int j = ; j <= n; ++j){
- if(G[i][j]) ++line;
- }
- }
- printf("%d %d\n",_mf,line);
- //输出联系
- for(int i = ; i <= n; ++i){
- for(int j = ; j <= n; ++j){
- if(G[i][j]) printf("%d %d %d\n",i,j,G[i][j]);
- }
- }
- }
- return ;
- }
kuangbin专题专题十一 网络流 POJ 3436 ACM Computer Factory的更多相关文章
- 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 (最大流)
题目链接: Poj 3436 ACM Computer Factory 题目描述: n个工厂,每个工厂能把电脑s态转化为d态,每个电脑有p个部件,问整个工厂系统在每个小时内最多能加工多少台电脑? 解题 ...
- POJ - 3436 ACM Computer Factory 网络流
POJ-3436:http://poj.org/problem?id=3436 题意 组配计算机,每个机器的能力为x,只能处理一定条件的计算机,能输出特定的计算机配置.进去的要求有1,进来的计算机这个 ...
- POJ 3436 ACM Computer Factory 最大流,拆点 难度:1
题目 http://poj.org/problem?id=3436 题意 有一条生产线,生产的产品共有p个(p<=10)零件,生产线上共有n台(n<=50)机器,每台机器可以每小时加工Qi ...
- POJ - 3436 ACM Computer Factory(最大流)
https://vjudge.net/problem/POJ-3436 题目描述: 正如你所知道的,ACM 竞赛中所有竞赛队伍使用的计算机必须是相同的,以保证参赛者在公平的环境下竞争.这就是所有这些 ...
- POJ 3436 ACM Computer Factory(最大流+路径输出)
http://poj.org/problem?id=3436 题意: 每台计算机包含P个部件,当所有这些部件都准备齐全后,计算机就组装完成了.计算机的生产过程通过N台不同的机器来完成,每台机器用它的性 ...
- POJ 3436 ACM Computer Factory (拆点+输出解)
[题意]每台计算机由P个零件组成,工厂里有n台机器,每台机器针对P个零件有不同的输入输出规格,现在给出每台机器每小时的产量,问如何建立流水线(连接各机器)使得每小时生产的计算机最多. 网络流的建图真的 ...
- POJ 3436 ACM Computer Factory
题意: 为了追求ACM比赛的公平性,所有用作ACM比赛的电脑性能是一样的,而ACM董事会专门有一条生产线来生产这样的电脑,随着比赛规模的越来越大,生产线的生产能力不能满足需要,所以说ACM董事会想 ...
- poj 3436 ACM Computer Factory 最大流+记录路径
题目 题意: 每一个机器有一个物品最大工作数量,还有一个对什么物品进行加工,加工后的物品是什么样.给你无限多个初始都是000....的机器,你需要找出来经过这些机器操作后最多有多少成功的机器(111. ...
随机推荐
- js实现instanceof
instanceof 是通过原型链判断的,A instanceof B, 在A的原型链中层层查找,是否有原型等于B.prototype,如果一直找到A的原型链的顶端null,仍然不等于B.pr ...
- Jquery Validate表单验证,动态添加和删除验证规则
最近一直在忙着维护Jquery的商城,用到了Validate的表单验证,觉得很有意思,就纪录一下. // 动态添加验证规则 $("#invoice_send_region_id") ...
- 【49.23%】【hdu 1828】Picture
Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...
- webpack 命令
--content-base <file/directory/url/port>:内容的路径. --quiet: 在控制台不输出任何内容 --no-info: 抑制无聊的信息 --colo ...
- 初识Contiv
Contiv是一个用于跨虚拟机.裸机.公有云或私有云的异构容器部署的开源容器网络架构.作为业界最强大的容器网络架构,Contiv具有2层.3层.overlay和ACI模式,能够与思科基础设施进行本地集 ...
- Android生命周期函数执行顺序
转载自:http://blog.csdn.net/intheair100/article/details/39061473 程序正常启动:onCreate()->onStart()->on ...
- win7+oracle11,vmbox中winxp连接
重启TNSLSNR 打开CMD,输入以下命令. lsnrctl stop lsnrctl start lsnrctl stat /////////////////////////////////// ...
- 如何把对象手动注入Spring容器并实现依赖注入
将对象注入到Spring容器并实现依赖注入 public class UserDao { @Resource AccountService accountService; public void pr ...
- mysql主从之主机名导致主从机制失败的问题
一 主库 mysql主服务器的正确配置需要指定log-bin.log-bin-index server-id = 1 log-bin=master-bin log-bin-index = master ...
- DRF框架中分页功能接口
目录 DRF框架中分页功能接口 DRF框架中分页功能接口 一.在框架中提供来三个类来实现分页功能,PageNumberPagination.LimitOffsetPagination.CursorPa ...