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相关推荐

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

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

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

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

  3. POJ 3436 ACM Computer Factory

    传送门:https://vjudge.net/problem/POJ-3436 题目大意: 每台电脑由p个零件组成,编号1-n.生产电脑完全由N台全自动的机器完成.每台机器能够添加一些零件和移除一些电 ...

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

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

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

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

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

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

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

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

  8. poj3436——ACM Computer Factory

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

  9. ACM比赛经验、刷题记录及模板库总结(更新中)

    前言 本文所提及的部分题目代码,可以在我的Github上找到 第一部分 经验分享及感受 第二部分 刷题记录 一.基础算法&程序语言 //strlen()函数的复杂度是O(n)要小心 //截取字 ...

最新文章

  1. NLP 层嵌入(embedding)层的理解 通俗易懂 转
  2. iOS端VR视频播放
  3. c++中利用sizeof运算符计算结构体大小问题探讨
  4. C# 功能完整的单表增删改查程序
  5. kibana操作elasticsearch:词条匹配(term)
  6. TDSQL 全时态数据库系统 -- 典型案例
  7. 20145335 《信息安全系统设计基础》第2周学习总结
  8. Appium移动端自动化测试之元素定位(三)
  9. Oracle中查询树结构start with...connect by prior子句用法
  10. 先搞定SLAM,再谈如何抓住下一代互联网产业爆发点!
  11. iPhone6分辨率
  12. 拓端tecdat|R语言中进行Spearman等级相关分析
  13. python手机版做小游戏代码大全-用Python设计一个经典小游戏
  14. 小波分析工具包 matlab,matlab小波工具箱下载|
  15. 国际h2真假u盘测试软件,u盘速度测试软件H2TEST
  16. imp-00017 oracle 942,IMP导入遇到IMP-00017,ORA-00942
  17. 利用N2N内网穿透,并实现直连
  18. 户外LED透明屏与室内透明屏区别,选型号建议
  19. 内网域横向PTHPTKPTT哈希票据传递
  20. HTTP协议漫谈 - HTTP协议历史和报文结构

热门文章

  1. Objective-C中的内存管理
  2. Kickstart的配置文件anaconda-ks.cfg解析
  3. jQuery数组处理详解(含实例演示)
  4. 工厂模式理解了没有?
  5. 03-2 BGP专有命令--BGP命令与配置手册
  6. Zabbix 3.2.6通过ODBC监控MySQLOracle
  7. JavaScript引用类型之Array数组之强大的splice()方法
  8. 苹果官方 Crash文件分析方法 (iOS系统Crash文件分析方法)
  9. C# 发送Http请求 - WebClient类
  10. Spark学习之简介