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. ...
随机推荐
- PowerShell 通过 WMI 获取系统安装的驱动
本文告诉大家如何通过 WMI 获取用户已经安装的驱动程序 通过下面代码可以获取用户已经安装的驱动程序 Get-WmiObject Win32_SystemDriver | Format-List Ca ...
- vue-learning:19 - js - filters
filters 基本使用 仅限在插值{{}}和v-bind指令中使用 管道符|分隔 链式调用 传入参数 全局注册和局部注册 纯函数性质(不能使用this) 基本使用 我们看下之前用计算属性实现的例子, ...
- koa2入门--01.ES6简单复习、koa2安装以及例子
1.ES6简单复习 /*let 和 const: let用于定义一个块作用域的变量,const 定义一个常量 */ let a = 'test'; const b = 2; /*对象的属性和方法的简写 ...
- bash: : Too many levels of symbolic links
ln -s 时 bash: : Too many levels of symbolic links改为绝对路径,
- Linux网络文件共享服务之FTP
一.FTP介绍 ftp(File Transfer Protocol)是早期的三个应用级协议之一,基于C/S结构,双通道协议,数据和命令连接,数据传输格式默认是二进制,当然也支持文件方式传输.默认情况 ...
- Struts2和Spring集成
Spring是一个流行的Web框架,它提供易于集成与很多常见的网络任务.所以,问题是,为什么我们需要Spring,当我们有Struts2?Spring是超过一个MVC框架 - 它提供了许多其它好用的东 ...
- C++,Windows/MFC_中L和_T()之区别
字符串前面加L表示该字符串是Unicode字符串._T是一个宏,如果项目使用了Unicode字符集(定义了UNICODE宏),则自动在字符串前面加上L,否则字符串不变.因此,Visual C++里边定 ...
- T-SQL代码搜索
SET ANSI_NULLS ON; SET ANSI_PADDING ON; SET ANSI_WARNINGS ON; SET CONCAT_NULL_YIELDS_NULL ON; SET NU ...
- Kubernetes Clusters
1. 创建集群 Kubernetes集群 Kubernetes协调一个高可用的计算机集群,作为一个单独的单元来一起工作.有了这种抽象,在Kubernetes中你就可以将容器化的应用程序部署到集群中, ...
- 《带你装B,带你飞》pytest修炼之路1- 简介和环境准备
1. pytest简介 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高.根据pytest的官方网站介 ...