题意:

有很多台机器,可以把物件从一种状态改装成另一种状态,初始全为\(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. 『言善信』Fiddler工具 — 3、Fiddler界面布局详解【菜单栏】

    目录 (一)Fiddler界面布局介绍 (二)菜单栏 1.File文件菜单: 2.Edit编辑菜单: 3.Rules规则菜单: 4.Tools工具菜单: 5.View视图菜单: 6.Help帮助菜单: ...

  2. 『言善信』Fiddler工具 — 4、Fiddler面布局详解【工具栏】

    目录 (一)工具栏详细介绍 1.第一组工具: 2.第二组工具: 3.第三组工具: 4.第四组工具: (二)工具栏使用说明 1.Fiddler修改代理端口: 2.过滤Tunnel to...443请求链 ...

  3. GEMM与AutoKernel算子优化

    GEMM与AutoKernel算子优化 随着AI技术的快速发展,深度学习在各个领域得到了广泛应用.深度学习模型能否成功在终端落地应用,满足产品需求,一个关键的指标就是神经网络模型的推理性能.一大波算法 ...

  4. AIoT开放平台及应用

    AIoT开放平台及应用 阿里AIoT开放平台,是阿里云IoT面向开发者的能力接入渠道,开发者可以在这里完成能力的申请.开通.部署.配置和集成开发等一些列工作.这些能力并不的独立交付,而是通过关联到行业 ...

  5. 国内操作系统OS分析(下)

    国内操作系统OS分析(下) 3.2 Android/iOS移动互联网时代 Android是一种基于Linux的自由及开放源代码的操作系统.主要使用于移动设备,如智能手机和平板电脑,由Google公司和 ...

  6. Spring如何使用三级缓存解决循环依赖

    Spring如何使用三级缓存解决循环依赖 首先来了解一下什么是循环依赖 @Component public class A { @Autowired B b; } @Component public ...

  7. 如何实现一个简易版的 Spring - 如何实现 AOP(终结篇)

    前言 在 上篇 实现了 判断一个类的方式是符合配置的 pointcut 表达式.根据一个 Bean 的名称和方法名,获取 Method 对象.实现了 BeforeAdvice.AfterReturni ...

  8. Linkerd 2.10(Step by Step)—使用 Kustomize 自定义 Linkerd 的配置

    Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...

  9. 树莓派写入openwrt作为路由器

    需要:树莓派4B,SD卡一张,SD卡读卡器一枚,openwrt镜像一份. 环境: Linux(deepin 20). 将SD卡插入读卡器,读卡器再插入电脑. 首先查看SD卡: sudo fdisk - ...

  10. klayout安装及使用教程

    klayout 版本:klayout-0.26.9 我的系统环境:Deepin20(可以视为Debian) 修改过的代码地址:https://github.com/stuartofmine/klayo ...