题目链接

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的更多相关文章

  1. POJ3436 ACM Computer Factory —— 最大流

    题目链接:https://vjudge.net/problem/POJ-3436 ACM Computer Factory Time Limit: 1000MS   Memory Limit: 655 ...

  2. POJ3436 ACM Computer Factory 【最大流】

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5412   Accepted: 1 ...

  3. POJ-3436 ACM Computer Factory(网络流EK)

    As you know, all the computers used for ACM contests must be identical, so the participants compete ...

  4. poj3436 ACM Computer Factory, 最大流,输出路径

    POJ 3436 ACM Computer Factory 电脑公司生产电脑有N个机器.每一个机器单位时间产量为Qi. 电脑由P个部件组成,每一个机器工作时仅仅能把有某些部件的半成品电脑(或什么都没有 ...

  5. POJ3436 ACM Computer Factory(最大流/Dinic)题解

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8944   Accepted: 3 ...

  6. poj-3436.ACM Computer Factory(最大流 + 多源多汇 + 结点容量 + 路径打印 + 流量统计)

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10940   Accepted:  ...

  7. POJ-3436 ACM Computer Factory 最大流 为何拆点

    题目链接:https://cn.vjudge.net/problem/POJ-3436 题意 懒得翻,找了个题意. 流水线上有N台机器装电脑,电脑有P个部件,每台机器有三个参数,产量,输入规格,输出规 ...

  8. POJ3436 ACM Computer Factory(最大流)

    题目链接. 分析: 题意很难懂. 大体是这样的:给每个点的具体情况,1.容量 2.进入状态 3.出去状态.求最大流. 因为有很多点,所以如果一个点的出去状态满足另一个点的进入状态,则这两个点可以连一条 ...

  9. POJ3436 ACM Computer Factory【EK算法】

    题意: 每个电脑需要P个组成部分,现有N的机器,每个机器都可以对电脑进行加工,不过加工的前提是某些部分已经存在,加工后会增加某些部分.且在单位时间内,每个机器的加工都有一个最大加工容量,求能得到的最大 ...

  10. POJ-3436:ACM Computer Factory (Dinic最大流)

    题目链接:http://poj.org/problem?id=3436 解题心得: 题目真的是超级复杂,但解出来就是一个网络流,建图稍显复杂.其实提炼出来就是一个工厂n个加工机器,每个机器有一个效率w ...

随机推荐

  1. ashx是什么文件

    ashx是什么文件 .ashx 文件用于写web handler的..ashx文件与.aspx文件类似,可以通过它来调用HttpHandler类,它免去了普通.aspx页面的控件解析以及页面处理的过程 ...

  2. JDK工具

    在之前的教程中,我曾介绍过 这些工具.现在,我向大家介绍其中最重要的5个工具. 1.javap javap是一个Java类文件反汇编程序,可以查看Java编译器生成的字节码,是分析代码的一个好工具.让 ...

  3. 客户端设置WebService调用超时时间

    刚接触WebService,对如何在客户端设置WebService调用超时时间查阅了一些资料,现总结如下: ============================================== ...

  4. ubuntu下apk的反编译

    今天调试一个程序的时候,因为需要上传数据到服务器,但是程序太过久远了,服务器上传的地址就忘记了,但是源码又不在我这里,因为要的急所以就被逼无奈的情况下想到了反编译,我用的是Linux Mint 14. ...

  5. linux服务器安装nodejs运行环境

    安装nodejs运行环境 第一步:到node官网下载相应版本的安装包,将安装包放置服务器上,路径为 usr/local/node(可根据自身情况进行修改) 第二步:解压 ***.tar.xz格式文件需 ...

  6. Tomcat8

    一.Apache Tomcat 8介绍 Tomcat 8.0.0-RC3 (alpha) Released                                                ...

  7. 红象云腾CRH 一键部署大数据平台

    平台: arm 类型: ARM 模板 软件包: azkaban hadoop 2.6 hbase hive kafka spark zeppelin azkaban basic software bi ...

  8. 撸了个 django 数据迁移工具 django-supertube

    撸了个 django 数据迁移工具 django-supertube 支持字段映射和动态字段转化. 欢迎 star,issue https://github.com/FingerLiu/django- ...

  9. vuejs组件的重要选项

    new Vue({ el:'#demo', data:{ message:'Hello vue.js!' } }) 我们看到这个括号里面包含了很多中间的选项,小括号里面其实是一些参数,这些参数指定了实 ...

  10. 如何在Mac上创建.txt文件

    cd ~/Desktoptouch test.txt cd 需要创建的文件夹目录vi 需要创建文件的文件名.txt