poj 3436 网络流构图经典
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 6012 | Accepted: 2083 | Special Judge |
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
Source
大概题意,每个机器有P个组件组成,现在给你M个机器的信息,问你最多能组装多少个电脑。
没行第一个参数 能容纳多少台电脑(可以看成网络流中,没条路的容量)
接下来有2P个参数 0 表示不需要 1表示必须有 2可以可有可无第2~p个参数 分别是安装这个电脑前需要的的条件
第p+1个参数到2P个参数表示 安装好后的机器具备那些组件例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
第一台机器可以装容纳15台机器,生产条件是全0(红色部分) 生产结果是(绿色部分) 这里只有第3第4台机器可以把整台电脑安装好,而进入机器3需要条件 0 1 2也就是第二个部件必须有,显然刚由1生产过的电脑能送到机器3组装成完整的电脑
这里我们可以采用拆点的方法去建立一个图来进行最短增广路得出结果当然需要有一个超级汇点和超级源点,显然把生产条件都是0的与超级源点相连,生产结果全为1的与超级汇点相连 权值当然是无穷大。然后把每台机器的生产条件和生产结果连接起来,因为在同一台机器。当然是连通的拉!权值当然是自己所能容纳的量机器之间怎么连接?00 11 21 12都可以匹配,而01 10就不能匹配,所以我们就可以轻易得出结论同部件相加等于1的机器不能相连;相连的机器权值为无穷大,这样我们的图就建好了!然后就可以用spfa,EK,dinic等算法解决,我这里用的是ISAP。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
int p,n;
int a[][];
int edge[][];
int flow[][];
int start,end;
int head[];
int pp[];
int EK(){
memset(flow,,sizeof(flow));
memset(head,-,sizeof(head)); int sum=;
while(true){
queue<int>q;
q.push(start);
memset(pp,,sizeof(pp)); pp[start]=0x7fffffff; while(!q.empty()){
int u=q.front();
q.pop();
for(int v=;v<=n+;v++){
if(!pp[v]&&edge[u][v]>flow[u][v]){
head[v]=u;
q.push(v);
pp[v]=min(pp[u],edge[u][v]-flow[u][v]); }
} } if(pp[end]==)
break;
for(int i=end;i!=start;i=head[i]){
flow[head[i]][i]+=pp[end];
flow[i][head[i]]-=pp[end];
}
sum+=pp[end];
}
return sum; }
int main(){
while(scanf("%d%d",&p,&n)!=EOF){
memset(a,,sizeof(a));
memset(edge,,sizeof(edge));
start=;
end=n+;
for(int i=;i<=*p+;i++){
a[][i]=;
a[n+][i]=;
}
for(int i=;i<=n;i++){
for(int j=;j<=*p;j++){
scanf("%d",&a[i][j]);
}
} for(int i=;i<=n+;i++){
for(int j=;j<=n+;j++){
if(i==j)
continue;
bool flag=true;
for(int k=;k<=p;k++){
if(!(a[j][k]==||a[i][k+p]==a[j][k]))
flag=false; } if(flag&&i==){
edge[][j]=a[j][];
}
else if(flag&&j==n+){
edge[i][n+]=a[i][];
}
else if(flag){
edge[i][j]=min(a[i][],a[j][]);
} }
} int total=EK();
printf("%d ",total);
int cnt=;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(flow[i][j]>)
cnt++;
}
}
printf("%d\n",cnt);
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(flow[i][j]>){
printf("%d %d %d\n",i,j,flow[i][j]);
}
}
} }
return ;
}
poj 3436 网络流构图经典的更多相关文章
- A - ACM Computer Factory POJ - 3436 网络流
A - ACM Computer Factory POJ - 3436 As you know, all the computers used for ACM contests must be ide ...
- ACM Computer Factory POJ - 3436 网络流拆点+路径还原
http://poj.org/problem?id=3436 每台电脑有$p$个组成部分,有$n$个工厂加工电脑. 每个工厂对于进入工厂的半成品的每个组成部分都有要求,由$p$个数字描述,0代表这个部 ...
- POJ 3436 ACM Computer Factory (网络流,最大流)
POJ 3436 ACM Computer Factory (网络流,最大流) Description As you know, all the computers used for ACM cont ...
- POJ - 3436 ACM Computer Factory 网络流
POJ-3436:http://poj.org/problem?id=3436 题意 组配计算机,每个机器的能力为x,只能处理一定条件的计算机,能输出特定的计算机配置.进去的要求有1,进来的计算机这个 ...
- Poj 3436 ACM Computer Factory (最大流)
题目链接: Poj 3436 ACM Computer Factory 题目描述: n个工厂,每个工厂能把电脑s态转化为d态,每个电脑有p个部件,问整个工厂系统在每个小时内最多能加工多少台电脑? 解题 ...
- POJ 2391 Ombrophobic Bovines ( 经典最大流 && Floyd && 二分 && 拆点建图)
题意 : 给出一些牛棚,每个牛棚都原本都有一些牛但是每个牛棚可以容纳的牛都是有限的,现在给出一些路与路的花费和牛棚拥有的牛和可以容纳牛的数量,要求最短能在多少时间内使得每头牛都有安身的牛棚.( 这里注 ...
- POJ 1149 PIGS ★(经典网络流构图)
[题意] 有M个猪圈,每个猪圈里初始时有若干头猪.一开始所有猪圈都是关闭的.依 次来了N个顾客,每个顾客分别会打开指定的几个猪圈,从中买若干头猪.每 个顾客分别都有他能够买的数量的上限.每个顾客走后, ...
- poj 1149经典网络流构图
题意:m个猪圈,n个客户,每个客户给出选则猪圈的钥匙和需要购买猪的个数,其中每次客户购买时客户选则的猪圈数量可以相互更换,问最大购买数量. 思路:以客户作为除源点汇点之外的点,然后对于每个猪圈从源点连 ...
- 网络流相关知识点以及题目//POJ1273 POJ 3436 POJ2112 POJ 1149
首先来认识一下网络流中最大流的问题 给定一个有向图G=(V,E),把图中的边看做成管道,边权看做成每根管道能通过的最大流量(容量),给定源点s和汇点t,在源点有一个水源,在汇点有一个蓄水池,问s-t的 ...
随机推荐
- Adobe Photoshop CS6下载安装
下载链接 http://yunpan.cn/cACgP6Lv5ygit (提取码:f37a) 第一步关键是断开网络,拔掉网线或断开无线 点击登录后,如果没有进入下面的界面,检查是否断网成功 至于选择安 ...
- url 解析
最近在做一个单页应用,使用AngularJS来处理一些页内路由(哈希#后的路由变化).自然会要解析URL中的参数.使用AngularJS自带的方法$location.search();可以自动将参数整 ...
- CTS、CLS、CLR分别作何解释?
CTS.CLS.CLR分别作何解释? 答:CTS:通用类型系统.CLS:通用语言规范.CLR:公共语言运行库.
- EBS补丁时遇到的问题
今天在给R12.1.3打17525552的时候,出现了这样的一个错误 ATTENTION: All workers either have failed or are waiting: FAILED: ...
- 返回用户指定页面的web服务器
import socket import re import os def handle_client(socket_con): """ 接收来自客户端的请求,并接收请求 ...
- Percona-Tookit工具包之pt-sift
Preface We've got a lot of files related with system performance which generated by pt-stalk ...
- 38.VUE学习之-全局组件和局部组件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- 【转载】java 客户端链接不上redis解决方案 (jedis)
本文出自:http://blog.csdn.net/lulidaitian/article/details/51946169 出现问题描述: 1.Could not get a resource fr ...
- 线程、进程、协程和GIL(三)
上一篇文章介绍了:创建线程的两种方式.Event对象判断线程是否启动.利用信号量控制线程并发. 博客链接:线程.进程.协程和GIL(二) 这一篇来说说线程间通信的那些事儿: 一个线程向另一个线程发送数 ...
- 创建控制器view的几种方式
1. 根据storyboard的描述创建 2. 通过xib的描述创建 3. 通过代码创建控制器的view self.window = [[UIWindow alloc] initWithFrame:[ ...