「POJ3436」ACM Computer Factory题解
题意:
有很多台机器,可以把物件从一种状态改装成另一种状态,初始全为\(0\),最终状态全为\(1\),让你可以拼凑机器,请问最大总性能为多少,且要求输出方案。
题解:
这道题是真的水啊,我不想写太多,加一点吧。我们发现,把一个机器当作点来看的话一个机器的加工数即为点权。而点权在网络流的题目里是\(SB\),于是考虑转化为边权。而且我们要控制流量,于是考虑进行拆点。
把点拆开后,因为初始是全为\(0\)的,所以将所有初始状态为\(0\)的机器的入点与超级源点连边,而所有最终状态为\(1\)的机器的出点与超级汇点连边。然后为了形成一条工业线,就去寻找如果有两个机器\(A,B\),其中\(A\)的最终状态就是\(B\)的初始状态,那么\(A\)的出点就会向\(B\)的入点连边。也就是他们可以形成匹配,因为这里你是要跑出一条路径来。
最后跑一遍\(Dinic\),即可求得第一个答案。
那么如何去输出方案呢?另外再开一个数组记录最开始的流量,最后去一一比较,如果存在最终流量与最开始的流量不一样,那么这条边就被用了,然后输出对应的两个点即可。而这边还要你输出匹配的机器方案有几行,那就跑两次就好了。
建模:
\([1]S\)向每个初始全为\(0\)的机器连一条流量为\(INF\)的边,因为你一台机器是可以和多台匹配的,而能不能匹配和可不可以匹配取决于你们之间的关系与剩余流量
\([2]T\)向每个末尾全为\(1\)的机器连一条权值也为\(INF\)的边,因为你一末尾也可以与多台匹配
\([3]\)寻找两个可以匹配的边,这之间同样连流量为\(INF\)的边
\([4]\)每个点的入点向出点连流量为性能效率的边
\(code\):
#include<bits/stdc++.h>
#define int long long
using namespace std;
template<typename T> inline void read(T &x){
T f=1;x=0;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
x*=f;
}
const int N = 205,M = 2e4,INF=2e9;
int p,n,nex[M],first[M],v[M],flow[M],num=1,ans=0;
int ss[N][N],tt[N][N],f[N];
int s,t,nxt[N],fro[N],ft[N];
void add(int from,int to,int val){
nex[++num]=first[from];
first[from]=num;
v[num]=to;
ft[num]=val;
flow[num]=val;
fro[num]=from;
}
int dep[N],q[N],no[N];
bool bfs(int s,int t){
memset(dep,0,sizeof(dep));
q[1]=s;
dep[s]=1;
no[s]=first[s];
int head=0,tail=1;
while(head!=tail){
int u=q[++head];
for(int i=first[u];i;i=nex[i]){
int to=v[i];
if(flow[i] && !dep[to]){
no[to]=first[to];
dep[to] = dep[u] + 1;
q[++tail] = to;
}
}
}
return dep[t]!=0;
}
int aim;
int dfs(int now,int fl){
if(now==aim) return fl;
int f=0;
for(int i=no[now];i&&fl;i=nex[i]){
no[now]=i;
int to=v[i];
if(flow[i] && dep[to] == dep[now]+1){
// from[to]=now;
// nxt[now]=to;
int x=dfs(to,min(fl,flow[i]));
flow[i]-=x;
flow[i^1]+=x;
fl-=x;
f+=x;
if(!fl) break;
}
}
if(!f) dep[now]=-2;
return f;
}
void mxflow(int s,int t){
aim=t;
while(bfs(s,t)){
ans+=dfs(s,1<<30);
}
return;
}
int vis[N];
signed main(){
read(p),read(n);
//一个机器有p个零件
//有n个机器
s=0;
t=2*n+1;
for(int i=1;i<=n;i++){
read(f[i]);
for(int j=1;j<=p;j++) read(ss[i][j]);
for(int j=1;j<=p;j++) read(tt[i][j]);
add(i,i+n,f[i]);
add(i+n,i,0);
}
for(int i=1;i<=n;i++){
int flag=0;
for(int j=1;j<=p;j++){
if(ss[i][j]==1){
flag=1;
break;
}
}
if(!flag){
add(s,i,INF);
add(i,s,0);
}
flag=0;
for(int j=1;j<=p;j++){
if(tt[i][j]==0||tt[i][j]==2){
flag=1;
break;
}
}
if(!flag){
add(i+n,t,INF);
add(t,i+n,0);
}
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
if(i==j) continue;
int flag=0;
for(int k=1;k<=p;k++) {
if(ss[j][k]==2||tt[i][k]==ss[j][k]) continue;
flag=1;
break;
}
if(!flag){
add(i+n,j,INF);
add(j,i+n,0);
}
}
}
mxflow(s,t);
printf("%lld ",ans);
int sum=0,cnt=0;
int tot=0;
for(int i=n+1;i<t;i++){
for(int j=first[i];j;j=nex[j]){
if(v[j]>0&&v[j]<=n&&ft[j]>flow[j]){
// printf("%lld %lld %lld\n",i-n,v[j],ft[j]-flow[j]);
++cnt;
}
}
}
printf("%lld\n",cnt);
for(int i=n+1;i<t;i++){
for(int j=first[i];j;j=nex[j]){
if(v[j]>0&&v[j]<=n&&ft[j]>flow[j]){
printf("%lld %lld %lld\n",i-n,v[j],ft[j]-flow[j]);
}
}
}
return 0;
}
「POJ3436」ACM Computer Factory题解的更多相关文章
- POJ3436:ACM Computer Factory(最大流)
ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9963 Accepted: 3 ...
- POJ3436 ACM Computer Factory(最大流/Dinic)题解
ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8944 Accepted: 3 ...
- POJ3436 ACM Computer Factory —— 最大流
题目链接:https://vjudge.net/problem/POJ-3436 ACM Computer Factory Time Limit: 1000MS Memory Limit: 655 ...
- POJ3436 ACM Computer Factory 【最大流】
ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5412 Accepted: 1 ...
- poj-3436.ACM Computer Factory(最大流 + 多源多汇 + 结点容量 + 路径打印 + 流量统计)
ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10940 Accepted: ...
- POJ-3436 ACM Computer Factory(网络流EK)
As you know, all the computers used for ACM contests must be identical, so the participants compete ...
- poj3436 ACM Computer Factory, 最大流,输出路径
POJ 3436 ACM Computer Factory 电脑公司生产电脑有N个机器.每一个机器单位时间产量为Qi. 电脑由P个部件组成,每一个机器工作时仅仅能把有某些部件的半成品电脑(或什么都没有 ...
- POJ 3436 ACM Computer Factory (网络流,最大流)
POJ 3436 ACM Computer Factory (网络流,最大流) Description As you know, all the computers used for ACM cont ...
- POJ 3464 ACM Computer Factory
ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4829 Accepted: 1641 ...
随机推荐
- CVD和ALD薄膜沉积技术应用领域
CVD和ALD薄膜沉积技术应用领域 显示 用于OLED.QD-OLED.甚至未来QLED的薄膜封装,通过有机/无机叠层结构的保护,水汽渗透率WVTR可降至10-5g/m2/day,保证OLED或者量子 ...
- 常用深度学习框——Caffe/ TensorFlow / Keras/ PyTorch/MXNet
常用深度学习框--Caffe/ TensorFlow / Keras/ PyTorch/MXNet 一.概述 近几年来,深度学习的研究和应用的热潮持续高涨,各种开源深度学习框架层出不穷,包括Tenso ...
- CPU的自动调度矩阵乘法
CPU的自动调度矩阵乘法 这是一个有关如何对CPU使用自动调度程序的文档. 与依靠手动模板定义搜索空间的基于模板的autotvm不同,自动调度程序不需要任何模板.用户只需要编写计算声明,而无需任何调度 ...
- 利用NVIDIA NGC的TensorRT容器优化和加速人工智能推理
利用NVIDIA NGC的TensorRT容器优化和加速人工智能推理 Optimizing and Accelerating AI Inference with the TensorRT Contai ...
- 谁才是智能家居的未来?视声M+O融合方案给出答案
有些智能家居,你不能说它不智能. 但在现实生活中,常常帅不过一秒. 就比如,当你经历了一天的疲惫后回到家,发现玄关的智能开关突然没反应,家里的灯怎么都打不开.这种时候你得明白,你的智能开关面板很有可能 ...
- 深入 Go 中各个高性能 JSON 解析库
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/535 其实本来我是没打算去看 JSON 库的性能问题的,但是最近我对 ...
- springboot2.x整合tkmapper
springboot整合tkmapper 1.导入pom依赖 1.1 导入springboot的parent依赖 <parent> <artifactId>spring-boo ...
- SpringBoot+SpringDataJpa快速上手(基本CRUD)
以及表结构和数据 依赖 <!-- 如果有SpringBoot启动器,就不加--> <parent> <groupId>org.springframework.boo ...
- 从实力的角度出发来思考这道AOP题目
文/楠木大叔 技术更迭,一往无前.技术人总是要不断学习以适应社会的发展和行业对我们的要求.每隔一段时间,就会有纷至沓来的新技术,新知识,新概念,我们应该如何应对,是被逼到墙角,还是主动出击? 导读 从 ...
- 三、Tomcat配置文件的介绍
*允许直接复制另外多份完整的tomcat数据,修改配置保证不冲突,起多个tomcat,优点:其中一个tomcat挂了不影响其他网页 tomcat配置文件server.xml介绍 <Server& ...