传送门:https://vjudge.net/problem/POJ-3436

题目大意:

每台电脑由p个零件组成,编号1~n。生产电脑完全由N台全自动的机器完成。每台机器能够添加一些零件和移除一些电脑零件。

用生产效率、输入规格、输出规格来描述每一台机器。

输入规格描述电脑必须具有那些零件,机器才能去加工它。这个输入规格由p个0,1,2整数的集合,0意味该零件必须不能存在,机器才能加工这个这台半成品电脑。相应的1是该零件必须存在,2是存在与否没有影响。

输出规格描述该半成品电脑经过该机器存在那些零件。这个输出规格是由0,1整数构成的集合,0意味着该办成品电脑,不具有该零件,1表示该电脑具有该零件。

问该工厂最大的生产效率是多少。

解题思路:

首先根据信息建图:

其中某个零件的组合方式有 00 01 02  10 11 12:

可以看出若组合中有01 10说明该机器不能连在一起。

耶耶耶,终于做对了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;const int MAXN=150;
const int INF=1<<20;struct Machine{int flow;int in[15],out[15];
}mac[MAXN];//检查该机器和源点之间是否有边
bool checkS(Machine a,int P){for(int i=0;i<P;i++)if(a.in[i]==1)return false;return true;
}//检查该机器和汇点n+1之间是否有边
bool checkT(Machine a,int P){for(int i=0;i<P;i++)if(a.out[i]!=1)return false;return true;
}//检查两个机器之间是否有边
bool checkEdge(Machine a,Machine b,int P){for(int i=0;i<P;i++)if(a.out[i]+b.in[i]==1)return false;return true;
}struct Edge{int to,next;int init;int flow;
}edges[MAXN*10];int head[MAXN];
int tot;
void init(){tot=0;memset(head,-1,sizeof(head));
}void addEdge(int u,int v,int flow){edges[tot].to=v;edges[tot].flow=flow;edges[tot].init=flow;edges[tot].next=head[u];head[u]=tot++;
}int level[MAXN];
bool makelevel(int s,int t ){memset(level,0,sizeof(level));level[s]=1;queue<int>q;q.push(s);while(!q.empty()){int u=q.front();q.pop();if(u==t) return true;for(int i=head[u];i!=-1;i=edges[i].next){int v=edges[i].to;if(!level[v]&&edges[i].flow){level[v]=level[u]+1;q.push(v);}}}return false;
}int DFS(int now,int maxf,int t){if(now==t) return maxf;int ret=0,f;for(int k=head[now];k!=-1;k=edges[k].next){int v=edges[k].to;if(edges[k].flow&&level[v]==level[now]+1){f=DFS(v,min(maxf-ret,edges[k].flow),t);edges[k].flow-=f;edges[k^1].flow+=f;ret+=f;}if(ret==maxf) return ret;}return ret;
}int Dinic(int s,int t){int ans=0;while(makelevel(s,t))ans+=DFS(s,INF,t);return ans;
}struct Node{int u;int v;int cap;Node(int u,int v,int cap):u(u),v(v),cap(cap){};Node(){};
};int main(){int P,N;while(scanf("%d%d",&P,&N)!=EOF){for(int i=1;i<=N;i++){scanf("%d",&mac[i].flow);for(int j=0;j<P;j++)scanf("%d",&mac[i].in[j]);for(int j=0;j<P;j++)scanf("%d",&mac[i].out[j]);}//下面是建图
    init();for(int i=1;i<=N;i++){if(checkS(mac[i],P)){    //这是检查该机器和源点0是否有边addEdge(0,i,mac[i].flow);addEdge(i,0,0);}if(checkT(mac[i],P)){  //这是检查该机器和汇点N+1是否有边addEdge(i,N+1,mac[i].flow);addEdge(N+1,i,0);}for(int j=1;j<=N;j++){   //这是检查机器i和机器j是否右边if(i==j) continue;if(checkEdge(mac[i],mac[j],P)){addEdge(i,j,mac[i].flow);addEdge(j,i,0);}}}int res=Dinic(0,N+1);vector<Node>ans;ans.clear();//如果最后残留网络的容量小于初始容量,说明该边是最大流走过的边for(int u=1;u<=N;u++){for(int j=head[u];j!=-1;j=edges[j].next){int v=edges[j].to;if(v>0&&v<=N&&edges[j].flow<edges[j].init){ans.push_back(Node(u,v,edges[j].init-edges[j].flow));}}}printf("%d %d\n",res,ans.size());for(int i=0;i<ans.size();i++){printf("%d %d %d\n",ans[i].u,ans[i].v,ans[i].cap);}}return 0;
}

转载于:https://www.cnblogs.com/IKnowYou0/p/6789144.html

POJ 3436 ACM Computer Factory相关推荐

  1. POJ 3436 -- ACM Computer Factory(最大流,建图)

    题目链接 Description As you know, all the computers used for ACM contests must be identical, so the part ...

  2. POJ 3436 ACM Computer Factory(最大流+路径输出)

    http://poj.org/problem?id=3436 题意: 每台计算机包含P个部件,当所有这些部件都准备齐全后,计算机就组装完成了.计算机的生产过程通过N台不同的机器来完成,每台机器用它的性 ...

  3. POJ - 3436 ACM Computer Factory(最大流+输出残余网络)

    题目链接:点击查看 题目大意:给出n个机器以及m个零件,m个零件分别代表电脑上的零件,每一个机器可以将电脑上零件的一种状态转变为另一种状态,并且每个机器都有单独的效率,现在对于每一个单独的零件,规定状 ...

  4. pku 3436 ACM Computer Factory ——最大流 EK

    http://poj.org/problem?id=3436 题意好难懂,有n个工厂加工电脑半成品,半成品电脑需要p个部件. 输入p(需要的部件数) n(工厂数) Qi  (工厂最大生产量)  Si, ...

  5. ACM Computer Factory

    ACM Computer Factory 题目链接:http://poj.org/problem?id=3436 网络流Dinic 将一个机器拆分成两个点,这两个点之间的容量为机器的加工量:建立一个超 ...

  6. A - ACM Computer Factory - poj 3436(最大流)

    题意:有一个ACM工厂会生产一些电脑,在这个工厂里面有一些生产线,分别生产不同的零件,不过他们生产的电脑可能是一体机,所以只能一些零件加工后别的生产线才可以继续加工,比如产品A在生产线1号加工后继续前 ...

  7. POJ3426 ACM Computer Factory——最大流(EK+输出路径)

    点这里 题意: 题目大意就是问把000加工到111(多少个零视输入的P而定)的最大零件个数,并且输出路径.   但是具体的加工规则真的是把我看晕了 然后我们来说说具体的加工规则:N台机器,每台机器能同 ...

  8. poj3436——ACM Computer Factory

    题目大意: 输入: 输出: 分析: 代码:转载自

  9. [poj 3436]最大流+输出结果每条边流量

    题目链接:http://poj.org/problem?id=3436 大力套kuangbin板过了orz #include<cstdio> #include<cstring> ...

最新文章

  1. liunx下的DNS配置
  2. 【经验心得】CS1.6:经典中的精品
  3. Citavi下载及使用
  4. 33条C#、.Net经典面试题目及答案[zt]
  5. 项目经理的商务指南系列之四:认识谈判(不做传声筒,不做顶门闩,进退之策,进退之法,有机事者必有机心)...
  6. 问题:ajaxSuccess() ajaxComplete() ajaxError()....??? 参数event xhr options的用法
  7. 键盘扫描码集(共三版)
  8. Camera2 camera i2c总线协议介绍
  9. 电子商务概论(农)之形考作业一
  10. 怎么把m4a转换成mp3?
  11. 分享抖音上热门技巧!短视频涨粉+运营攻略!
  12. JavaScript学习笔记01——简介(李炎恢JavaScript教程)
  13. 第三章 输入验证----tapestry教程Enjoying Web DevelopmenEnjoying Development翻译
  14. 滴滴新算法让你应对女友?道翰天琼认知智能机器人平台API接口大脑为您揭秘-64
  15. YOLO V1 论文精讲
  16. 《所谓高情商,就是会说话》思维导图精华分享
  17. android qq截屏快捷键是什么,手机截屏的快捷键是什么,超过3种截图的快捷键操作方法!...
  18. GCN:图卷积神经网络
  19. 明天水立方的免费区块链沙龙,讲师阵容庞大,别说我没告诉过你!
  20. fastjson和json对比。fastjson快速入门。

热门文章

  1. iPhone上将短信内容发送到指定邮箱的方法
  2. Nginx服务器的安装配置
  3. [Vim 使用]vim 自动括号补全配置
  4. 45 MySQL自增id
  5. 实例1、查询数据(多级组织)
  6. php 实现一致性hash 算法 memcache
  7. 对付惰性必杀:(10+2)*5法
  8. Android开发之自定义TabHost文字及背景(源代码分享)
  9. msdn关于Visual C++ 编译器选项的说明
  10. Binder相关面试总结(二):Binder到底是什么?