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. ...
随机推荐
- H3C配置热键--hotkey---系统视图
Hotkey作用 hotkey 命令用来为某一快捷键指定相应的命令行. undo hotkey 命令用来恢复系统的默认值. —————————————————————————————————————— ...
- WPF实现软键盘
wpf 实现一个软键盘, 先发个图: 工作有需要实现一个软键盘,本来想用windows自带的软键盘凑合凑合得了,又觉得那个软键盘太大了,所以自己实现了一个. 说一下实现的思路,其实没什么思路 界面就是 ...
- UE4 C++ 代码编译方式
Unreal 有一个非常酷的特性 —> 不必关闭编辑器就可以编译 C++ 更改! 有两种方法可以达到这个目的: 1.直接点击编辑器主工具栏中的 编译(Compile) 按钮. 2.在编辑器继续运 ...
- Elasticsearch慢查询故障诊断
最近在做ES搜索调优,看了一些lucene搜索的文档和代码,本文用于总结调优过程中学到的知识和自己的思考. 在抓到ES慢查询之后,会通过profile或者kibana的Search Profiler ...
- 第三阶段:3.Web端产品设计:4.产品设计-交互设计
交互设计主要做框架层以及结构层.包括交互关系,信息结构,界面布局,导航设计,信息内容. 导航关系非常重要. 这是框架层. 这是结构层. 要素就是信息内容.
- 【python测试开发栈】—帮你总结Python os模块高频使用的方法
Python中的os模块是主要和系统操作相关的模块,在平时的工作中会经常用到,花时间整理了os模块的高频使用方法,同时整理出使用时需要注意的点.归纳来讲,os模块的方法可以分为:目录操作.文件操作.路 ...
- 如何查看linux是否打开虚拟化
[服务器虚拟化] 执行命令: cat /proc/cpuinfo |grep vmx 如果有输出,则说明CPU支持虚拟化技术. --------> svm - Secure virtua ...
- 洛谷$P4322\ [JSOI2016]$最佳团体 二分+$dp$
正解:二分+$dp$ 解题报告: 传送门$QwQ$ 这题长得好套路嗷,,,就一看就看出来是个$01$分数规划+树形$dp$嘛$QwQ$. 考虑现在二分的值为$mid$,若$mid\leq as$,则有 ...
- Spring 资源注入
Spring开发中经常需要调用各种资源,包含普通文件.网址.配置文件.系统环境变量等,我们可以使用Spring表达式语言(Spring-EL)实现资源的注入. Spring主要使用@Value注解实现 ...
- ApacheHudi常见问题汇总
欢迎关注公众号:ApacheHudi 1. ApacheHudi对个人和组织何时有用 如果你希望将数据快速提取到HDFS或云存储中,Hudi可以提供帮助.另外,如果你的ETL /hive/spark作 ...