题意:

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

思路:

最大流,EK算法。先建图,这里用邻接矩阵能比较简洁,由于每个机器(点)有权值,所以拆点,中间由与其权值想等的边连接,然后两两匹配,看是否能构成边。

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int Max = ;
const int eMax = ;
const int inf = 0x3f3f3f3f; struct
{
int w, in[], out[];
}mac[Max]; struct
{
int v, ini_w, w, re, next;
}edge[eMax]; int p, n, max_flow, num,k, edgeHead[Max],que[Max], pre[Max];
bool vis[Max]; void addedge(int u, int v, int w)
{
edge[k].v = v;
edge[k].ini_w = edge[k].w = w;
edge[k].next = edgeHead[u];
edge[k].re = k+;
edgeHead[u] = k ++;
edge[k].v = u;
edge[k].ini_w = edge[k].w = ;
edge[k].next = edgeHead[v];
edge[k].re = k-;
edgeHead[v] = k ++;
} int bfs()
{
int head, tail, i, u, v;
memset(vis, , sizeof(vis));
head = tail = ;
que[tail ++] = ;
vis[] = true;
while(tail > head){
u = que[head ++];
for(i = edgeHead[u]; i != ; i = edge[i].next){
v = edge[i].v;
if(!vis[v] && edge[i].w){
pre[v] = i;
if(v == *n+) return true;
que[tail ++] = v;
vis[v] = true;
}
}
}
return false;
} void end()
{
int u, p, sum = inf;
for(u = *n+; u != ; u = edge[edge[p].re].v){
p = pre[u];
sum = min(sum, edge[p].w);
}
for(u = *n+; u != ; u = edge[edge[p].re].v){
p = pre[u];
edge[p].w -= sum;
edge[edge[p].re].w += sum;
}
max_flow += sum;
} int main()
{
int i, j, u, m;
bool flag;
cin>>p>>n;
for(k = , i = ; i <= n; i ++)
{
cin>>mac[i].w;
flag = true;
for(j = ; j < p; j ++)
{
cin>>mac[i].in[j];
if(mac[i].in[j] == ) flag = false; // 这里要注意,0020也可以连源点,与汇点不同!
}
if(flag) addedge(, i, inf);
flag = true;
for(j = ; j < p; j ++)
{
cin>>mac[i].out[j];
if(mac[i].out[j] != ) flag = false;
}
if(flag) addedge(n+i, *n+, inf);
}
for(i = ; i <= n; i ++)
{
addedge(i, n+i, mac[i].w); // 拆点。
for(j = ; j <= n; j ++)
{
if(i == j) continue;
flag = true;
for(m = ; m < p; m ++)
if(mac[j].in[m] != && mac[j].in[m] != mac[i].out[m])
{
flag = false;
break;
}
if(flag) addedge(n+i, j, inf);
}
}
max_flow = , num = ;
while(bfs()) end();
for(u = n+; u < *n+ ; u ++) // 流经路径的输出,用邻接矩阵会更简洁。
for(i = edgeHead[u]; i != ; i = edge[i].next)
if(edge[i].v > && edge[i].v <= n && edge[i].ini_w > edge[i].w)
num ++;
cout<<max_flow<<" "<<num<<endl;
for(u = n+; u < *n+ ; u ++)
for(i = edgeHead[u]; i != ; i = edge[i].next)
if(edge[i].v > && edge[i].v <= n && edge[i].ini_w > edge[i].w)
cout<<u-n<<" "<<edge[i].v<<" "<<edge[i].ini_w - edge[i].w<<endl;
return ;
}

POJ3436 ACM Computer Factory【EK算法】的更多相关文章

  1. POJ3436 ACM Computer Factory —— 最大流

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

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

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

  3. POJ3436 ACM Computer Factory 【最大流】

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

  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. POJ3436 ACM Computer Factory(最大流)

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

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

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

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

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

随机推荐

  1. html页面出现&#65279,影响布局

    这个问题只会在chrome和edge浏览器出现.由于该HTML页面是由PHP解析模版生成的. UTF-8 + BOM编码方式一般会在windows操作系统中出现,比如WINDOWS自带的记事本等软件, ...

  2. 震惊!1MB == 1000KB??

    稍微对电脑了解一点的同学可能都知道,电脑中的单位换算是: 1KB = 1024B 1MB = 1024KB 1GB = 1024MB ... 以前,我也是这么认为的.... 最近我在Linux解压某个 ...

  3. A1005. Spell It Right

    Given a non-negative integer N, your task is to compute the sum of all the digits of N, and output e ...

  4. 【POJ3613】Cow Relays 离散化+倍增+矩阵乘法

    题目大意:给定一个 N 个顶点,M 条边的无向图,求从起点到终点恰好经过 K 个点的最短路. 题解:设 \(d[1][i][j]\) 表示恰好经过一条边 i,j 两点的最短路,那么有 \(d[r+m] ...

  5. css实现单选效果,看看有趣的tabIndex

    以前我实现单选变色几乎都是用js实现的,今天看到有个css属性可以直接实现单选变色,很开心啊~ 话不多说看效果 实现的代码如下 下面我们看看用focus实现别的有趣的效果 话不多说看效果 实现的代码如 ...

  6. Mac挂载虚拟机的共享文件夹

    说明:sshfs可以帮助本地mac访问虚拟机上的共享文件夹,从而操作虚拟机上的文件夹非常方便 1.安装sshfs sudo port install sshfs 2.使用,指定远程目录,到本地某一目录 ...

  7. NOIP 普及组 2014 比例简化

    传送门 https://www.cnblogs.com/violet-acmer/p/9898636.html 题解: 一开始想多了,以为得保证两者之间的相对比率,至少不能改变的太离谱啊. but,直 ...

  8. 下拉列表JComboBox,列表框JList

    1.下拉列表JComboBox public class Demo extends JFrame { public Demo() { setBounds(100, 100, 200, 100); se ...

  9. 基于 Dojo toolkit 实现 web2.0 的 MVC 模式

    前言 MVC 模式是设计模式中的经典模式,它可以有效的分离数据层,展示层,和业务逻辑层.Web2.0 技术由于其良好的用户体验被广泛应用于 WEB 应用的展示层.但是在传统的 web 开发中,展示层的 ...

  10. 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'Address'中的标识列指

    在有自增长的SQL表格里面插入指定ID的数据的时候,会禁止你操作,提示如题目,解决办法: set identity_insert address on ,,,) set identity_insert ...