POJ 3436 ACM Computer Factory
题意:
为了追求ACM比赛的公平性,所有用作ACM比赛的电脑性能是一样的,而ACM董事会专门有一条生产线来生产这样的电脑,随着比赛规模的越来越大,生产线的生产能力不能满足需要,所以说ACM董事会想要重新建造一条生产线。
生产线是全自动化的,所以需要机器来组成生产线,给定有多少中种机器,标准ACM用电脑有多少部份,每种机器将什么样的ACM电脑半成品处理成什么样的电脑半成品(对于输入的电脑半成品,每部分有0,1,2三种状态:代表着 0、这部分必须没有我才能处理,1、这部分必须有我才能处理,2、这部分有没有我都能处理。对于输出的电脑半成品有0,1两种状态:代表着0,处理完后的电脑半成品里没有这部分,1、处理完的电脑半成品有这部分),每一个机器每小时可以处理Q个半成品(输入数据中的Qi)。
求组装好的成产线的最大工作效率(每小时最多生成多少成品,成品的定义就是所有部分的状态都是“1”)



#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
typedef long long LL;
const int INF = 1e9+;
const int maxn = ;
const int MOD = 1e9+; int G[maxn][maxn], Layer[maxn], G2[maxn][maxn];
struct node
{
int in[], out[];///第i台机器的输入输出规格
int flow;///第i台机器能放出的最大流量
} P[maxn];
int n, m;///n台机器,每台机器需要m个零件 bool OK(int a,int b)
{
for(int i=; i<=m; i++)
{
if( !(P[a].out[i] == P[b].in[i] || P[b].in[i] == ) )
return false;
}
return true;
} bool BFS(int Star,int End)
{
memset(Layer, , sizeof(Layer));
Layer[Star] = ;
queue<int> Q;
Q.push(Star); while( Q.size() )
{
int s = Q.front();
Q.pop(); if(s == End) return true; for(int i=; i<= End; i++)
{
if(G[s][i] && !Layer[i])
{
Layer[i] = Layer[s] + ;
Q.push(i);
}
}
}
return false;
}
int DFS(int s,int End, int MaxFlow)
{
if(s == End) return MaxFlow; int sFlow = ;///从s出发到达汇点的最大流量 for(int i=; i<=End; i++)
{
int flow = G[s][i]; if( G[s][i]== || Layer[s]+ != Layer[i] ) continue; flow = min(MaxFlow-sFlow, flow);
flow = DFS(i, End, flow);
G[s][i] -= flow;
G[i][s] += flow;
sFlow += flow;
if(sFlow == MaxFlow)
break ;
}
if(sFlow == )
Layer[s] = ;
return sFlow;
} int Dinic(int Star,int End)
{
int ans = ;
while( BFS(Star, End) )
{
ans += DFS(Star, End, INF);
}
return ans;
} int main()
{ while(scanf("%d %d", &m, &n) != EOF)
{
memset(G, , sizeof(G));
memset(P, , sizeof(P));
for(int i=; i<=n; i++)
{
scanf("%d", &P[i].flow);
for(int j=; j<=m; j++)
scanf("%d", &P[i].in[j]); for(int j=; j<=m; j++)
scanf("%d", &P[i].out[j]);
}
for(int i=; i<=m; i++)
{
P[].in[i] = P[].out[i] = ;
P[n+].in[i] = P[n+].out[i] = ;
}
P[].flow = P[n+].flow = INF;
n ++; for(int i=; i<=n; i++)
for(int j=; j<=n; j++)
{
if(i == j)
G[j+n][i] = P[i].flow;
else if( OK(i, j) )
G[i][j+n] = P[i].flow;
}
memcpy(G2, G, sizeof(G));
int MaxFlow = Dinic(, n*);
int num = , a[maxn], b[maxn], c[maxn]; for(int i=; i<n; i++)
for(int j=; j<n; j++)
{
if(i == j)continue; if(G2[i][j+n] > G[i][j+n])
{
a[num] = i, b[num] = j;
c[num++] = G2[i][j+n] - G[i][j+n];
}
} printf("%d %d\n", MaxFlow, num); for(int i=; i<num; i++)
printf("%d %d %d\n", a[i], b[i], c[i]); }
return ;
}
/*
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
*/
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(最大流+路径输出)
http://poj.org/problem?id=3436 题意: 每台计算机包含P个部件,当所有这些部件都准备齐全后,计算机就组装完成了.计算机的生产过程通过N台不同的机器来完成,每台机器用它的性 ...
- POJ - 3436 ACM Computer Factory(最大流)
https://vjudge.net/problem/POJ-3436 题目描述: 正如你所知道的,ACM 竞赛中所有竞赛队伍使用的计算机必须是相同的,以保证参赛者在公平的环境下竞争.这就是所有这些 ...
- POJ 3436 ACM Computer Factory (拆点+输出解)
[题意]每台计算机由P个零件组成,工厂里有n台机器,每台机器针对P个零件有不同的输入输出规格,现在给出每台机器每小时的产量,问如何建立流水线(连接各机器)使得每小时生产的计算机最多. 网络流的建图真的 ...
- 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 ...
- poj 3436 ACM Computer Factory 最大流+记录路径
题目 题意: 每一个机器有一个物品最大工作数量,还有一个对什么物品进行加工,加工后的物品是什么样.给你无限多个初始都是000....的机器,你需要找出来经过这些机器操作后最多有多少成功的机器(111. ...
随机推荐
- sql语句游标的写法
当循环查找一张表的信息时,我们得写一张游标来对每条信息进行操作,具体格式如下 DECLARE @fitemid int DECLARE #point_cursor CURSORFORSELECT fi ...
- Svg图片在asp网站上的使用
最近需要做一个动态的根据后台的返回数据而动态显示的导航图,然后我就采用了jquery+ajax+SVG矢量图来实现这个功能. 首先,客户给了个ai的矢量图,我对这一块不懂就找以前同事帮我转成了svg图 ...
- hibernate中有时候复杂删除有时候可以拆分为两个语句
这个demo是使用原生的sql语句写的,也就是没有调用我在struts中已经写好的公用类common中的增删改查功能,所以要开启事务
- apk文件解析,学习笔记
Android 应用程序包文件 (APK) 是一种Android操作系统上的应用程序安装文件格式,其英文全称为 “application package file” . 如果懂得使用反编译工具,可以下 ...
- Android开发--推送
需要的知识点:Notification.Service 第三方开源框架 : android-async-http-master 推送的来源:android项目中,有时会有这样一种需求:客户每隔一段时间 ...
- window.showModalDialog()复制内容
ShowModalDialog 打开的 页面上加入个 <span id="mySpan" name="mySpan" contentEditable=&q ...
- PHP 进行统一邮箱登陆的代理实现(swoole)
在工作的过程中,经常会有很多应用有发邮件的需求,这个时候需要在每个应用中配置smtp服务器.一旦公司调整了smtp服务器的配置,比如修改了密码等,这个时候对于维护的人员来说要逐一修改应用中smtp的配 ...
- Ubuntu Server 14.04 下root无法ssh登陆
今天安装了Ubuntu Server 14.04 在终端配置了root密码后,使用SecureCRT和putty竟然不能ssh登陆,SecureCRT一直提示密码不对,但是可以肯定输入的密码100 ...
- iOS LaunchScreen设置启动图片,启动页停留时间
[新建的iOS 项目启动画面默认为LaunchScreen.xib] 如果想实现一张图片作为启动页,如下图
- XML有哪些解析方式有何优缺点?xml有哪些解析技术?区别是什么?
有DOM,SAX,STAX等 (1):DOM:处理大型文件时其性能下降的非常厉害.这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XM ...