ACM Computer Factory
ACM Computer Factory
题目链接:http://poj.org/problem?id=3436
网络流Dinic
将一个机器拆分成两个点,这两个点之间的容量为机器的加工量;建立一个超级源点和超级汇点,并将满足条件的点连接在一起,容量均为inf。之后跑Dinic算法即可。
注意输出的时候不要求输出为路径顺序(这里坑了一晚上才知道不需要=。=)
代码如下:
1 #include <cstdio> 2 #include <vector> 3 #include <cstring> 4 #include <queue> 5 #define pb(x) push_back(x) 6 #define N 200 7 using namespace std; 8 int const inf=1<<30; 9 struct edge{ 10 int to,rev,cap; 11 edge(int _to=0,int _cap=0,int _rev=0){ 12 to=_to;rev=_rev;cap=_cap; 13 } 14 }; 15 struct node{ 16 int from,to,c; 17 node(int _from=0,int _to=0,int _c=0){ 18 from=_from;to=_to;c=_c; 19 } 20 }; 21 struct dinic{ 22 vector<edge>g[N]; 23 int level[N],iter[N]; 24 void init(int s,int t){ 25 for(int i=s;i<=t;++i)g[i].clear(); 26 } 27 void add(int u,int v,int c){ 28 g[u].pb(edge(v,c,g[v].size())); 29 g[v].pb(edge(u,0,g[u].size()-1)); 30 } 31 bool bfs(int s,int t){ 32 memset(level,-1,sizeof(level)); 33 queue<int>q; 34 q.push(s); 35 level[s]=0; 36 while(!q.empty()){ 37 int u=q.front();q.pop(); 38 for(int i=0;i<g[u].size();++i){ 39 edge e=g[u][i]; 40 if(level[e.to]<0&&e.cap>0){ 41 level[e.to]=level[u]+1; 42 q.push(e.to); 43 } 44 } 45 } 46 return level[t]>=0; 47 } 48 int dfs(int u,int t,int f){ 49 if(u==t)return f; 50 for(int &i=iter[u];i<g[u].size();++i){ 51 edge &e=g[u][i]; 52 if(level[u]<level[e.to]&&e.cap>0){ 53 int d=dfs(e.to,t,f>e.cap?e.cap:f); 54 if(d>0){ 55 e.cap-=d; 56 g[e.to][e.rev].cap+=d; 57 return d; 58 } 59 } 60 } 61 return 0; 62 } 63 int maxflow(int s,int t){ 64 int flow=0,f; 65 while(bfs(s,t)){ 66 memset(iter,0,sizeof(iter)); 67 while((f=dfs(s,t,inf))>0)flow+=f; 68 } 69 return flow; 70 } 71 void print(int n){ 72 printf("%d ",maxflow(0,1)); 73 int ans=0; 74 for(int i=1;i<=2*n;++i){ 75 for(int j=0;j<g[2*i+1].size();++j){ 76 edge e=g[2*i+1][j]; 77 if(e.to!=1&&e.cap>0&&e.cap<inf&&e.to!=2*i) 78 ans++; 79 } 80 } 81 printf("%d\n",ans); 82 for(int i=1;i<=2*n;++i){ 83 for(int j=0;j<g[2*i+1].size();++j){ 84 edge e=g[2*i+1][j]; 85 if(e.to!=1&&e.cap>0&&e.cap<inf&&e.to!=2*i) 86 printf("%d %d %d\n",i,e.to/2,inf-e.cap); 87 } 88 } 89 } 90 }G; 91 int p,n; 92 struct nod{ 93 int c,in[15],out[15]; 94 void add(){ 95 scanf("%d",&c); 96 for(int i=0;i<p;++i) 97 scanf("%d",&in[i]); 98 for(int i=0;i<p;++i) 99 scanf("%d",&out[i]); 100 } 101 bool match(nod t){ 102 for(int i=0;i<p;++i) 103 if(out[i]+t.in[i]==1)return 0; 104 return 1; 105 } 106 bool ifs(){ 107 for(int i=0;i<p;++i) 108 if(in[i]==1)return 0; 109 return 1; 110 } 111 bool ift(){ 112 for(int i=0;i<p;++i) 113 if(out[i]==0)return 0; 114 return 1; 115 } 116 }a[55]; 117 void init(){ 118 G.init(0,2*n+2); 119 for(int i=1;i<=n;++i){ 120 a[i].add();//s=0,t=1 121 G.add(2*i,2*i+1,a[i].c);//将i拆成2*i和2*i+1 122 if(a[i].ifs())G.add(0,2*i,inf); 123 if(a[i].ift())G.add(2*i+1,1,inf); 124 } 125 for(int i=1;i<=n;++i) 126 for(int j=1;j<=n;++j) 127 if(i!=j&&a[i].match(a[j])) 128 G.add(2*i+1,2*j,inf); 129 } 130 int main(void){ 131 while(~scanf("%d%d",&p,&n)){ 132 init(); 133 G.print(n); 134 } 135 }
转载于:https://www.cnblogs.com/barrier/p/6096000.html
ACM Computer Factory相关推荐
- POJ 3436 -- ACM Computer Factory(最大流,建图)
题目链接 Description As you know, all the computers used for ACM contests must be identical, so the part ...
- A - ACM Computer Factory - poj 3436(最大流)
题意:有一个ACM工厂会生产一些电脑,在这个工厂里面有一些生产线,分别生产不同的零件,不过他们生产的电脑可能是一体机,所以只能一些零件加工后别的生产线才可以继续加工,比如产品A在生产线1号加工后继续前 ...
- POJ 3436 ACM Computer Factory
传送门:https://vjudge.net/problem/POJ-3436 题目大意: 每台电脑由p个零件组成,编号1-n.生产电脑完全由N台全自动的机器完成.每台机器能够添加一些零件和移除一些电 ...
- pku 3436 ACM Computer Factory ——最大流 EK
http://poj.org/problem?id=3436 题意好难懂,有n个工厂加工电脑半成品,半成品电脑需要p个部件. 输入p(需要的部件数) n(工厂数) Qi (工厂最大生产量) Si, ...
- POJ 3436 ACM Computer Factory(最大流+路径输出)
http://poj.org/problem?id=3436 题意: 每台计算机包含P个部件,当所有这些部件都准备齐全后,计算机就组装完成了.计算机的生产过程通过N台不同的机器来完成,每台机器用它的性 ...
- POJ - 3436 ACM Computer Factory(最大流+输出残余网络)
题目链接:点击查看 题目大意:给出n个机器以及m个零件,m个零件分别代表电脑上的零件,每一个机器可以将电脑上零件的一种状态转变为另一种状态,并且每个机器都有单独的效率,现在对于每一个单独的零件,规定状 ...
- POJ3426 ACM Computer Factory——最大流(EK+输出路径)
点这里 题意: 题目大意就是问把000加工到111(多少个零视输入的P而定)的最大零件个数,并且输出路径. 但是具体的加工规则真的是把我看晕了 然后我们来说说具体的加工规则:N台机器,每台机器能同 ...
- poj3436——ACM Computer Factory
题目大意: 输入: 输出: 分析: 代码:转载自
- ACM比赛经验、刷题记录及模板库总结(更新中)
前言 本文所提及的部分题目代码,可以在我的Github上找到 第一部分 经验分享及感受 第二部分 刷题记录 一.基础算法&程序语言 //strlen()函数的复杂度是O(n)要小心 //截取字 ...
最新文章
- NLP 层嵌入(embedding)层的理解 通俗易懂 转
- iOS端VR视频播放
- c++中利用sizeof运算符计算结构体大小问题探讨
- C# 功能完整的单表增删改查程序
- kibana操作elasticsearch:词条匹配(term)
- TDSQL 全时态数据库系统 -- 典型案例
- 20145335 《信息安全系统设计基础》第2周学习总结
- Appium移动端自动化测试之元素定位(三)
- Oracle中查询树结构start with...connect by prior子句用法
- 先搞定SLAM,再谈如何抓住下一代互联网产业爆发点!
- iPhone6分辨率
- 拓端tecdat|R语言中进行Spearman等级相关分析
- python手机版做小游戏代码大全-用Python设计一个经典小游戏
- 小波分析工具包 matlab,matlab小波工具箱下载|
- 国际h2真假u盘测试软件,u盘速度测试软件H2TEST
- imp-00017 oracle 942,IMP导入遇到IMP-00017,ORA-00942
- 利用N2N内网穿透,并实现直连
- 户外LED透明屏与室内透明屏区别,选型号建议
- 内网域横向PTHPTKPTT哈希票据传递
- HTTP协议漫谈 - HTTP协议历史和报文结构