POJ3436------ACM Computer Factory
ACM Computer Factory
Description
As you know, all the computers used for ACM contests must be identical, so the participants compete on equal terms. That is why all these computers are historically produced at the same factory.
Every ACM computer consists of P parts. When all these parts are present, the computer is ready and can be shipped to one of the numerous ACM contests.
Computer manufacturing is fully automated by using N various machines. Each machine removes some parts from a half-finished computer and adds some new parts (removing of parts is sometimes necessary as the parts cannot be added to a computer in arbitrary order). Each machine is described by its performance (measured in computers per hour), input and output specification.
Input specification describes which parts must be present in a half-finished computer for the machine to be able to operate on it. The specification is a set of P numbers 0, 1 or 2 (one number for each part), where 0 means that corresponding part must not be present, 1 — the part is required, 2 — presence of the part doesn’t matter.
Output specification describes the result of the operation, and is a set of P numbers 0 or 1, where 0 means that the part is absent, 1 — the part is present.
The machines are connected by very fast production lines so that delivery time is negligibly small compared to production time.
After many years of operation the overall performance of the ACM Computer Factory became insufficient for satisfying the growing contest needs. That is why ACM directorate decided to upgrade the factory.
As different machines were installed in different time periods, they were often not optimally connected to the existing factory machines. It was noted that the easiest way to upgrade the factory is to rearrange production lines. ACM directorate decided to entrust you with solving this problem.
Input
Input file contains integers P N, then N descriptions of the machines. The description of ith machine is represented as by 2 P + 1 integers Qi Si,1 Si,2…Si,P Di,1 Di,2…Di,P, where Qi specifies performance, Si,j — input specification for part j, Di,k — output specification for part k.
Constraints
1 ≤ P ≤ 10, 1 ≤ N ≤ 50, 1 ≤ Qi ≤ 10000
Output
Output the maximum possible overall performance, then M — number of connections that must be made, then M descriptions of the connections. Each connection between machines A and B must be described by three positive numbers A B W, where W is the number of computers delivered from A to B per hour.
If several solutions exist, output any of them.
Sample Input
Sample input 1
3 4
15 0 0 0 0 1 0
10 0 0 0 0 1 1
30 0 1 2 1 1 1
3 0 2 1 1 1 1
Sample input 2
3 5
5 0 0 0 0 1 0
100 0 1 0 1 0 1
3 0 1 0 1 1 0
1 1 0 1 1 1 0
300 1 1 2 1 1 1
Sample input 3
2 2
100 0 0 1 0
200 0 1 1 1
Sample Output
Sample output 1
25 2
1 3 15
2 3 10
Sample output 2
4 5
1 3 3
3 5 3
1 2 1
2 4 1
4 5 1
Sample output 3
0 0
Hint
Bold texts appearing in the sample sections are informative and do not form part of the actual data.
题意:有N台机器生产电脑,每个电脑有p个部件,,同时每个机器都有一个效率。不同机器能够安装的部件不一定一样,面对不同的机器,我们需要让两个机器对接起来。
题解: 这个题需要通过拆点去做,机器与机器是之间的传输是无穷大的但是机器内部并不是,下面是我画的第一个样例的图示
我用的是EK算法。代码不够精炼,还望海涵。
#include<stdio.h>
#include<string.h>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=100;
int in[55][20],out[50][20];
int cap[MAXN][MAXN];
int pre[MAXN];
bool vis[MAXN];
int p,n;
int N=n*2;
bool match(int *a,int *b)
{
for(int i=1;i<=p;i++)
{
if(a[i]==b[i]) continue;
if(b[i]==2) continue;
return false;
}
return true;
}
bool matchs(int *a)
{
for(int i=1;i<=p;i++)
{
if(a[i]==1)
return false;
}
return true;
}
bool matcht(int *b)
{
for(int i=1;i<=p;i++)
{
if(b[i]==0)
return false;
}
return true;
}
bool bfs(int s,int t)
{
memset(pre, -1, sizeof(pre));
queue<int> que;
memset(vis,0 , sizeof(vis));
vis[s]=true;
pre[s]=s;
que.push(s);
int p;
while(!que.empty())
{
p=que.front();
que.pop();
for(int i=0;i<=N;i++)
{
if(!vis[i]&&cap[p][i]>0)
{
vis[i]=true;
pre[i]=p;
if(i==t) return true;
que.push(i);
}
}
}
return false;
}
int EK(int s,int t)
{
int ans=0,d;
while (bfs(s,t))
{
d=INF;
for(int i=t;i!=s;i=pre[i])
d=min(d,cap[pre[i]][i]);
for(int i=t;i!=s;i=pre[i])
{
cap[pre[i]][i]-=d;
cap[i][pre[i]]+=d;
}
ans+=d;
}
return ans;
}
int main()
{
while(scanf("%d%d",&p,&n )!=EOF)
{
memset(cap,0 , sizeof(cap));
int c;
for(int i=1;i<=n;i++)
{
scanf("%d",&c);
cap[2*i-1][2*i]=c;
for(int j=1;j<=p;j++)
scanf("%d",&in[i][j]);
for(int j=1;j<=p;j++)
scanf("%d",&out[i][j]);
}
N=2*n+1;
for(int i=1;i<=n;i++)
{
if(matchs(in[i]))
{
cap[0][2*i-1]=INF;
// printf("%d %d---\n",0,2*i-1);
}
if(matcht(out[i]))
{
cap[2*i][N]=INF;
// printf("%d %d++++\n",2*i,N);
}
for(int j=1;j<=n;j++)
{
if(match(out[i],in[j]))
{
cap[2*i][2*j-1]=INF;
// printf("%d %d##\n",2*i,2*j-1);
}
}
}
printf("%d ",EK(0,N));
int ans=0;
int x[MAXN],y[MAXN],z[MAXN];
for (int i = 1; i <n; ++i)
{
for(int j=1;j<=n;j++)
{
if(match(out[i],in[j]))
{
if(cap[2*i][2*j-1]!=INF)
{
ans++;
x[ans-1]=i;y[ans-1]=j;z[ans-1]=INF-cap[2*i][2*j-1];
if(z[ans-1]<0)//此处是考虑会把回去的边计算上,我们需要把他去掉。
ans--;
}
}
}
}
printf("%d\n",ans);
for(int i=0;i<ans;i++)
printf("%d %d %d\n",x[i],y[i],z[i]);
}
return 0;
}
POJ3436------ACM Computer Factory的更多相关文章
- POJ3436 ACM Computer Factory —— 最大流
题目链接:https://vjudge.net/problem/POJ-3436 ACM Computer Factory Time Limit: 1000MS Memory Limit: 655 ...
- POJ3436 ACM Computer Factory 【最大流】
ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5412 Accepted: 1 ...
- POJ-3436 ACM Computer Factory(网络流EK)
As you know, all the computers used for ACM contests must be identical, so the participants compete ...
- poj3436 ACM Computer Factory, 最大流,输出路径
POJ 3436 ACM Computer Factory 电脑公司生产电脑有N个机器.每一个机器单位时间产量为Qi. 电脑由P个部件组成,每一个机器工作时仅仅能把有某些部件的半成品电脑(或什么都没有 ...
- POJ3436 ACM Computer Factory(最大流/Dinic)题解
ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8944 Accepted: 3 ...
- poj-3436.ACM Computer Factory(最大流 + 多源多汇 + 结点容量 + 路径打印 + 流量统计)
ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10940 Accepted: ...
- POJ-3436 ACM Computer Factory 最大流 为何拆点
题目链接:https://cn.vjudge.net/problem/POJ-3436 题意 懒得翻,找了个题意. 流水线上有N台机器装电脑,电脑有P个部件,每台机器有三个参数,产量,输入规格,输出规 ...
- POJ3436 ACM Computer Factory(最大流)
题目链接. 分析: 题意很难懂. 大体是这样的:给每个点的具体情况,1.容量 2.进入状态 3.出去状态.求最大流. 因为有很多点,所以如果一个点的出去状态满足另一个点的进入状态,则这两个点可以连一条 ...
- POJ3436 ACM Computer Factory【EK算法】
题意: 每个电脑需要P个组成部分,现有N的机器,每个机器都可以对电脑进行加工,不过加工的前提是某些部分已经存在,加工后会增加某些部分.且在单位时间内,每个机器的加工都有一个最大加工容量,求能得到的最大 ...
- POJ-3436:ACM Computer Factory (Dinic最大流)
题目链接:http://poj.org/problem?id=3436 解题心得: 题目真的是超级复杂,但解出来就是一个网络流,建图稍显复杂.其实提炼出来就是一个工厂n个加工机器,每个机器有一个效率w ...
随机推荐
- 引用 Session详解 作者:郎云鹏
本文转载自leeldy<Session详解 作者:郎云鹏> 引用 leeldy 的 Session详解 作者:郎云鹏 目录: 一.术语session 二.HTTP协议与状态保持 三.理 ...
- ps使用
1.图片剪裁 1.按快捷键M(矩形选择工具)-> 选中要扣出的图片(按shift可正方形)->按快捷键C(剪裁工具)->双击鼠标选中区域,剪裁成功. 2.选中psd中的图标 1.按快 ...
- ArcGIS API for JavaScript开发初探——基础知识
1.前言 在ArcGIS Web API开发体系中一共有四大类,分别为: ArcGIS API for Flex ArcGIS API for JavaScript ArcGIS API for RE ...
- 域名与IP地址的联系与区别
我们也知道每一台机都有一个唯一ip地址, 特别难记,所以出现了今天的DNS(域名) 当我们的计算机想要和一个远程机器连接时,我们可以申请连接该机器ip地址下的DNS,例如:www.baidu.com. ...
- python 之 BeautifulSoup 常用提取
一.bs4信息提取后返回的数据类型 soup.find('tbody') ---> 返回结构是一个bs4.element.Tag soup.find('tbody').children ---& ...
- NopCommerce 3.80框架研究(三)替换tinymce 为KindEditor
NopCommerce 自带的编辑器tinymce 功能不是很全.所以尝试将其替换为功能更强大的 KindEditor 并替实现文件上传和在线浏览功能 首先下载 并解压到如下位置 请注意这里是部署在N ...
- 一个SAP顾问在美国的这些年
今天的文章来自我的老乡宋浩,之前作为SAP顾问在美国工作多年.如今即将加入SAP成都研究院S4CRM开发团队.我们都是大邑人. 大邑县隶属于四川省成都市,位于成都平原西部,与邛崃山脉接壤.东与崇州市交 ...
- 小记:vue 及 react 的工程项目入口小结及 webpack 配置多页面应用参考
一.前言 闲暇时间,看了下前端的基础知识,有幸参与了公司公众号项目前面的一个阶段,学习到了一些前端框架的相关知识 小结了一下 自己练习通过新建一个个文件组织起项目的过程中的一些理解 二.项目入口 vu ...
- 利用kvo实现列表倒计时
自己稍微记录一下,方便以后用到: 先创建一个定时器的类: #import "TimeCenter.h" @interface TimeCenter () @property (no ...
- 关于后台获取不到HiddenField值的有关问题
服务器加载aspx程序时,首先要执行后台cs文件中的page_load等方法中的代码,其它按钮事件等是不执行的,生成页面发送到客户端.客户端执行时会响应js脚本,提交到服务器后除了执行page_loa ...