题意:

有很多台机器,可以把物件从一种状态改装成另一种状态,初始全为\(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题解的更多相关文章

  1. POJ3436:ACM Computer Factory(最大流)

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9963   Accepted: 3 ...

  2. POJ3436 ACM Computer Factory(最大流/Dinic)题解

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8944   Accepted: 3 ...

  3. POJ3436 ACM Computer Factory —— 最大流

    题目链接:https://vjudge.net/problem/POJ-3436 ACM Computer Factory Time Limit: 1000MS   Memory Limit: 655 ...

  4. POJ3436 ACM Computer Factory 【最大流】

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5412   Accepted: 1 ...

  5. poj-3436.ACM Computer Factory(最大流 + 多源多汇 + 结点容量 + 路径打印 + 流量统计)

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10940   Accepted:  ...

  6. POJ-3436 ACM Computer Factory(网络流EK)

    As you know, all the computers used for ACM contests must be identical, so the participants compete ...

  7. poj3436 ACM Computer Factory, 最大流,输出路径

    POJ 3436 ACM Computer Factory 电脑公司生产电脑有N个机器.每一个机器单位时间产量为Qi. 电脑由P个部件组成,每一个机器工作时仅仅能把有某些部件的半成品电脑(或什么都没有 ...

  8. POJ 3436 ACM Computer Factory (网络流,最大流)

    POJ 3436 ACM Computer Factory (网络流,最大流) Description As you know, all the computers used for ACM cont ...

  9. POJ 3464 ACM Computer Factory

    ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4829 Accepted: 1641 ...

随机推荐

  1. CVD和ALD薄膜沉积技术应用领域

    CVD和ALD薄膜沉积技术应用领域 显示 用于OLED.QD-OLED.甚至未来QLED的薄膜封装,通过有机/无机叠层结构的保护,水汽渗透率WVTR可降至10-5g/m2/day,保证OLED或者量子 ...

  2. 常用深度学习框——Caffe/ TensorFlow / Keras/ PyTorch/MXNet

    常用深度学习框--Caffe/ TensorFlow / Keras/ PyTorch/MXNet 一.概述 近几年来,深度学习的研究和应用的热潮持续高涨,各种开源深度学习框架层出不穷,包括Tenso ...

  3. CPU的自动调度矩阵乘法

    CPU的自动调度矩阵乘法 这是一个有关如何对CPU使用自动调度程序的文档. 与依靠手动模板定义搜索空间的基于模板的autotvm不同,自动调度程序不需要任何模板.用户只需要编写计算声明,而无需任何调度 ...

  4. 利用NVIDIA NGC的TensorRT容器优化和加速人工智能推理

    利用NVIDIA NGC的TensorRT容器优化和加速人工智能推理 Optimizing and Accelerating AI Inference with the TensorRT Contai ...

  5. 谁才是智能家居的未来?视声M+O融合方案给出答案

    有些智能家居,你不能说它不智能. 但在现实生活中,常常帅不过一秒. 就比如,当你经历了一天的疲惫后回到家,发现玄关的智能开关突然没反应,家里的灯怎么都打不开.这种时候你得明白,你的智能开关面板很有可能 ...

  6. 深入 Go 中各个高性能 JSON 解析库

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/535 其实本来我是没打算去看 JSON 库的性能问题的,但是最近我对 ...

  7. springboot2.x整合tkmapper

    springboot整合tkmapper 1.导入pom依赖 1.1 导入springboot的parent依赖 <parent> <artifactId>spring-boo ...

  8. SpringBoot+SpringDataJpa快速上手(基本CRUD)

    以及表结构和数据 依赖 <!-- 如果有SpringBoot启动器,就不加--> <parent> <groupId>org.springframework.boo ...

  9. 从实力的角度出发来思考这道AOP题目

    文/楠木大叔 技术更迭,一往无前.技术人总是要不断学习以适应社会的发展和行业对我们的要求.每隔一段时间,就会有纷至沓来的新技术,新知识,新概念,我们应该如何应对,是被逼到墙角,还是主动出击? 导读 从 ...

  10. 三、Tomcat配置文件的介绍

    *允许直接复制另外多份完整的tomcat数据,修改配置保证不冲突,起多个tomcat,优点:其中一个tomcat挂了不影响其他网页 tomcat配置文件server.xml介绍 <Server& ...