http://poj.org/problem?id=3436

题意:

每台计算机包含P个部件,当所有这些部件都准备齐全后,计算机就组装完成了。计算机的生产过程通过N台不同的机器来完成,每台机器用它的性能(每小时组装多少台电脑)、输入/输出规格来描述。

输入规格描述了机器在组装计算机时哪些部件必须准备好了。输入规格是由P个整数组成,每个整数代表一个部件,这些整数取值为0、1或2,其中0表示该部件不应该已经准备好了,1表示该部件必须已经准备好了,2表示该部件是否已经准备好了无关紧要。

输出规格描述了该机器组装的结果。输出规格也是由P个整数组成,每个整数取值 为0或1,其中0代表该部件没有生产好,1代表该部件生产好了。

输出每单位时间内的最大产量和连接数量和路径。

思路:
因为每台机器都有一个产量,所以这里拆点,容量为机器的产量。

对每台机器进行检验,如果它的要求中不包含1,那么它就和源点相连,说明这台机器是可以最先开始组装电脑的,如果它的输出中全是1,说明这台机器已经把电脑组装好了,和汇点相连。

然后机器之间两两判断,是否可以相连。

  1 #include<iostream>
  2 #include<algorithm>
  3 #include<cstring>
  4 #include<cstdio>
  5 #include<sstream>
  6 #include<vector>
  7 #include<stack>
  8 #include<queue>
  9 #include<cmath>
 10 #include<map>
 11 #include<set>
 12 using namespace std;
 13 typedef long long ll;
 14 typedef pair<int,int> pll;
 15 const int INF = 0x3f3f3f3f;
 16 const int maxn = 200 + 5;
 17
 18 struct Edge
 19 {
 20     int from,to,cap,flow;
 21     Edge(int u,int v,int w,int f):from(u),to(v),cap(w),flow(f){}
 22 };
 23
 24 struct Dinic
 25 {
 26     int n,m,s,t;
 27     vector<Edge> edges;
 28     vector<int> G[maxn];
 29     bool vis[maxn];
 30     int cur[maxn];
 31     int d[maxn];
 32
 33     void init(int n)
 34     {
 35         this->n=n;
 36         for(int i=0;i<n;++i) G[i].clear();
 37         edges.clear();
 38     }
 39
 40     void AddEdge(int from,int to,int cap)
 41     {
 42         edges.push_back( Edge(from,to,cap,0) );
 43         edges.push_back( Edge(to,from,0,0) );
 44         m=edges.size();
 45         G[from].push_back(m-2);
 46         G[to].push_back(m-1);
 47     }
 48
 49     bool BFS()
 50     {
 51         queue<int> Q;
 52         memset(vis,0,sizeof(vis));
 53         vis[s]=true;
 54         d[s]=0;
 55         Q.push(s);
 56         while(!Q.empty())
 57         {
 58             int x=Q.front(); Q.pop();
 59             for(int i=0;i<G[x].size();++i)
 60             {
 61                 Edge& e=edges[G[x][i]];
 62                 if(!vis[e.to] && e.cap>e.flow)
 63                 {
 64                     vis[e.to]=true;
 65                     d[e.to]=d[x]+1;
 66                     Q.push(e.to);
 67                 }
 68             }
 69         }
 70         return vis[t];
 71     }
 72
 73     int DFS(int x,int a)
 74     {
 75         if(x==t || a==0) return a;
 76         int flow=0, f;
 77         for(int &i=cur[x];i<G[x].size();++i)
 78         {
 79             Edge &e=edges[G[x][i]];
 80             if(d[e.to]==d[x]+1 && (f=DFS(e.to,min(a,e.cap-e.flow) ) )>0)
 81             {
 82                 e.flow +=f;
 83                 edges[G[x][i]^1].flow -=f;
 84                 flow +=f;
 85                 a -=f;
 86                 if(a==0) break;
 87             }
 88         }
 89         return flow;
 90     }
 91
 92     int Maxflow(int s,int t)
 93     {
 94         this->s=s; this->t=t;
 95         int flow=0;
 96         while(BFS())
 97         {
 98             memset(cur,0,sizeof(cur));
 99             flow +=DFS(s,INF);
100         }
101         return flow;
102     }
103 }DC;
104
105 int p,n;
106 int w[maxn];
107 int s[maxn][maxn];
108 int d[maxn][maxn];
109
110 bool isStart(int x)
111 {
112     for(int i=1;i<=p;i++)
113         if(s[x][i]==1)  return false;
114     return true;
115 }
116
117 bool isEnd(int x)
118 {
119     for(int i=1;i<=p;i++)
120     {
121         if(d[x][i]==0)  return false;
122     }
123     return true;
124 }
125
126 bool connect(int x, int y)
127 {
128     for(int i=1;i<=p;i++)
129     {
130         if((s[y][i]==1 && d[x][i]==0) ||(s[y][i]==0 && d[x][i]==1))   return false;
131     }
132     return true;
133 }
134
135 int main()
136 {
137     //freopen("in.txt","r",stdin);
138     while(~scanf("%d%d",&p,&n))
139     {
140         int src=0, dst=2*n+1;
141         DC.init(dst+1);
142
143         for(int i=1;i<=n;i++)
144         {
145             scanf("%d",&w[i]);
146
147             for(int j=1;j<=p;j++)
148                 scanf("%d",&s[i][j]);
149             for(int j=1;j<=p;j++)
150                 scanf("%d",&d[i][j]);
151
152             if(isStart(i)) DC.AddEdge(src,i,INF);
153             if(isEnd(i))  DC.AddEdge(i+n,dst,INF);
154         }
155
156         for(int i=1;i<=n;i++)  DC.AddEdge(i,i+n,w[i]);
157
158         for(int i=1;i<=n;i++)
159         {
160             for(int j=1;j<=n;j++)
161             {
162                 if(i==j)  continue;
163                 if(connect(i,j))   DC.AddEdge(i+n,j,INF);
164             }
165         }
166
167         int ans=DC.Maxflow(src,dst);
168
169         int cnt=0;
170         for(int i=0;i<DC.edges.size();i++)
171         {
172             Edge& e=DC.edges[i];
173             if(e.from==src || e.from==dst || e.to==src || e.to==dst)  continue;
174             if((e.from+n)==e.to||(e.from-n)==e.to)  continue;
175             if(e.flow<0)  cnt++;
176         }
177         printf("%d %d\n",ans,cnt);
178
179         for(int i=0;i<DC.edges.size();i++)
180         {
181             Edge& e=DC.edges[i];
182             if(e.from==src || e.from==dst || e.to==src || e.to==dst)  continue;
183             if((e.from+n)==e.to||(e.from-n)==e.to)  continue;
184             if(e.flow<0)
185                 printf("%d %d %d\n",e.to-n,e.from,-e.flow);
186         }
187     }
188     return 0;
189 }

转载于:https://www.cnblogs.com/zyb993963526/p/7220223.html

POJ 3436 ACM Computer Factory(最大流+路径输出)相关推荐

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

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

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

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

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

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

  4. POJ 3436 ACM Computer Factory

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

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

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

  6. ACM Computer Factory

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

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

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

  8. poj3436——ACM Computer Factory

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

  9. poj 3414 Pots(广搜BFS+路径输出)

    转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=3414 此题和poj ...

最新文章

  1. c语言中11 3等于多少,C语言|博客作业11
  2. 详细设计说明书读后感_明晚十点,和大家详细介绍这本版式设计新书!
  3. ssas 数据源mysql_BI之SSAS完整实战教程2 -- 开发环境介绍及多维数据集数据源准备...
  4. Codeforces Round #565 (Div. 3) A. Divide it!
  5. 串口MSComm控件五种不同校验方式对数据收发的影响
  6. 《Effective Debugging:软件和系统调试的66个有效方法》一第5条:在能够正常运作的系统与发生故障的系统之间寻找差别...
  7. ubuntu mysql 初始化_Ubuntu初始化MySQL碰到的坑
  8. web靶机:kali linux 2.0下搭建DVWA渗透测试演练平台
  9. Taints和Tolerations联用,将pod部署到k8s的master节点
  10. 机械加工工艺师手册_机械加工中车、刨、铣、镗、磨、钻、线切割等设备,你知道哪些?...
  11. linux制作img镜像文件,制作img镜像文件的5种方法 .
  12. 阿里云大学>【Python学习路线】Python语言基础自测考试 - 初级难度 | 包过关系列
  13. 安徽财贸职业学院计算机信息管理怎么样,让别人看看安徽财贸职业学院计算机系汪永涛辅导员如何对待我的!!...
  14. SUSE Linux Enterprise Server 12 SP3系统安装详解
  15. Phusion Passenger
  16. element时间日期选择器组件设置默认时间
  17. 台式计算机是移动设备吗,超台式电脑!手机成中国第一大上网终端
  18. 联想拯救者Y700评测 怎么样
  19. 微信支付签名失败(几种解决方案)
  20. js 实现input框或textarea的文本复制功能

热门文章

  1. 深入探讨ROP 载荷分析
  2. java使用keystore认证过程(license认证)
  3. 怎么钢枪_这样玩《和平精英》有手就能上皇冠?教你玩吃鸡怎么涨KD
  4. python3 修饰器_【python3】修饰器简单理解
  5. 变压器轻载是什么意思?
  6. 关于QVariant 的学习一点分享
  7. Qt模型、视图解读之视图
  8. html项目答辩开场白,毕业论文答辩演讲稿开场白范例
  9. vc6 前进后退 番茄_openMP 使用 VC6+Intel Compiler 9.1 (来自网络)
  10. 机器学习线性回归_机器学习-线性回归