题意:

每个电脑需要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. BZOJ2152[国家集训队]聪聪可可——点分治

    题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已 ...

  2. linq 分组取各组最大值

    static List<User> list1 = new List<User>() { new User(){id=1,name="张三"}, new U ...

  3. 自学工业控制网络之路1.6-典型的现场总线介绍Interbus

    返回 自学工业控制网络之路 自学工业控制网络之路1.6-典型的现场总线介绍Interbus 1987年正式公布,其主要技术开发者为德国的PhoenixContact公司.1996年,INTERBUS成 ...

  4. 【BZOJ2426】[HAOI2010]工厂选址(贪心)

    [BZOJ2426][HAOI2010]工厂选址(贪心) 题面 BZOJ 洛谷 题解 首先看懂题目到底在做什么. 然而发现我们显然可以对于每个备选位置跑一遍费用流,然后并不够优秀. 不难发现所有的位置 ...

  5. cf1063A Oh Those Palindromes (贪心)

    给一些字符 求它们能拼成的字符串 的回文子串的个数最大值 对应的那个字符串 就是把相同的都放一起是最优的,排下序就行了... #include<bits/stdc++.h> #define ...

  6. pytesseract 使用框架

    import pytesseract import cv2 img = cv2.imread("captcha.jpg",0) try: img.shape except Attr ...

  7. 在Sqlite中通过Replace来实现插入和更新

      你可能在批量处理一个事务的时候,想要批量插入一系列的数据,但是这些数据当添加完一次之后,重新添加的时候,你不想要重新添加,只是想将原有的数据进行更新,例如:我想要通过Excel将一系列的图书导入到 ...

  8. CSS3:文字属性

    文字属性注意的细节: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  9. P1450 [HAOI2008]硬币购物

    题目描述 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. di,s<=100000 ...

  10. 函数和常用模块【day04】:函数的非固定参数(三)

    本节内容 1.概述 2.默认参数 3.参数组 4.总结 一.概述 在上一篇博客中我已经写了,位置参数和关键字参数,下面我们来谈谈默认参数和参数组 二.默认参数 默认参数指的是,我们在传参之前,先给参数 ...