题意:有一个ACM工厂会生产一些电脑,在这个工厂里面有一些生产线,分别生产不同的零件,不过他们生产的电脑可能是一体机,所以只能一些零件加工后别的生产线才可以继续加工,比如产品A在生产线1号加工后继续前往生产线2号继续加工,直到成为完全产品。输入 P 意思是这个电脑需要P个零件,N表示有N个生产线,每个生产线都有最大加工量,并且需要什么零件和输出的是什么零件,0表示没有这个零件,1表示有这个零件,2表示有没有都可以。

样例说明:
1号: 15  
  -->  

2号: 10  
  -->  

3号: 30  
  -->  

4号: 3   
  -->  

1号生产线需要0 0 0这样的零件(这样的零件也就是无限制零件,源点),它可以把零件加工成 0 1 0 这个样子,然后 3 号生产线可以接受这种零件,并且加工成 1 1 1 也就是成品,到这样也就加工成功了,因为1号生产线每次可以加工 15 个零件,所以1->3的加工量就是 15,同理 2->3的加工量是 10,所以结果是 25。

分析:很明显的网络流题目,感觉难点应该在题目阅读和建图上.....可以用0当做源点 N+1当做汇点,然后每两点都进行匹配一些,看看是否可以连接,路径的权值为出点的生产能力。

注意:因为每个生产线的生产能力有限,所以需要拆点,防止超出他的生产能力,比如下图如果不拆点结果就会使20,实际上是10

Sample output 1” “
Sample output 1
”!!!!就是这个坑我错了好多次

/**************************分割线**************分割线**************************************/

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;

const int MAXN = 107;
const int oo = 1e9+7;

int G[MAXN][MAXN], layer[MAXN], G1[MAXN][MAXN];
int P, N;///需要P个零件,N条生产线
///表示生产线,需要的零件in,输出的零件out,最大生产值Flow
struct node{int in[MAXN], out[MAXN], Flow;}a[MAXN];

void InIt()
{
    memset(G, false, sizeof(G));
    memset(G1, false, sizeof(G1));

for(int i=1; i<=P; i++)
    {
        a[1].out[i] = 0;
        a[1].in[i] = 0;
        a[N+2].in[i] = 1;
        a[N+2].out[i] = 1;
    }
    a[1].Flow = oo;
    a[N+2].Flow = oo;
}
bool canLink(node n1, node n2)
{///n1输出的零件是否是n2需要的
    for(int i=1; i<=P; i++)
    {
        if(n1.out[i] != n2.in[i] && n2.in[i] != 2)
            return false;
    }

return true;
}
bool bfs(int start, int End)
{
    int used[MAXN] = {0};
    queue<int> Q;Q.push(start);
    memset(layer, -1, sizeof(layer));
    used[start] = true, layer[start] = 0;

while(Q.size())
    {
        int u = Q.front();Q.pop();

if(u == End)return true;

for(int i=1; i<=End; i++)
        {
            if(G[u][i] && !used[i])
            {
                used[i] = true;
                layer[i] = layer[u] + 1;
                Q.push(i);
            }
        }
    }

return false;
}
int dfs(int u, int MaxFlow, int End)
{
    if(u == End)return MaxFlow;

int uFlow = 0;

for(int i=0; i<=End; i++)
    {
        if(layer[u]+1==layer[i] && G[u][i])
        {
            int flow = min(MaxFlow-uFlow, G[u][i]);
            flow = dfs(i, flow, End);

G[u][i] -= flow;
            G[i][u] += flow;
            uFlow += flow;

if(uFlow == MaxFlow)
                break;
        }
    }

return uFlow;
}
int dinic(int start, int End)
{
    int MaxFlow = 0;

while(bfs(start, End) == true)
        MaxFlow += dfs(start, oo, End);

return MaxFlow;
}

int main()
{
    while(scanf("%d%d", &P, &N) != EOF)
    {
        int i, j;

InIt();

for(i=2; i<=N+1; i++)
        {
            scanf("%d", &a[i].Flow);
            for(j=1; j<=P; j++)
                scanf("%d", &a[i].in[j]);
            for(j=1; j<=P; j++)
                scanf("%d", &a[i].out[j]);
        }

N+=2;

for(i=1; i<=N; i++)
        for(j=1; j<=N; j++)
        {
            if(i == j)
            {
                G1[i][j+N] = G[i][j+N] = a[i].Flow;
            }
            else if(i!=j && canLink(a[i], a[j]) == true)
            {
                G1[i+N][j] = G[i+N][j] = a[i].Flow;
            }
        }

int MaxFlow = dinic(1, N*2);
        int k=0, x[MAXN], y[MAXN], flow[MAXN];

for(i=2; i<N; i++)
        for(j=2; j<N; j++)
        {
            if(G[i+N][j] < G1[i+N][j])
            {
                x[k] = i;
                y[k] = j;
                flow[k++] = G1[i+N][j] - G[i+N][j];
            }
        }

printf("%d %d\n", MaxFlow, k);
        for(i=0; i<k; i++)
            printf("%d %d %d\n", x[i]-1, y[i]-1, flow[i]);
    }

return 0;
}
/**
输入

3 5
10  0 0 0  0 1 0
10  0 0 0  0 1 0
10  0 1 0  0 1 1
10  0 1 1  1 1 1
10  0 1 1  1 1 1

输出

10 2
1 3 10
3 4 10

**/

转载于:https://www.cnblogs.com/liuxin13/p/4711704.html

A - ACM Computer Factory - poj 3436(最大流)相关推荐

  1. POJ 3436 -- ACM Computer Factory(最大流,建图)

    题目链接 Description As you know, all the computers used for ACM contests must be identical, so the part ...

  2. ACM Computer Factory

    ACM Computer Factory 题目链接:http://poj.org/problem?id=3436 网络流Dinic 将一个机器拆分成两个点,这两个点之间的容量为机器的加工量:建立一个超 ...

  3. POJ 3436 ACM Computer Factory(最大流+路径输出)

    http://poj.org/problem?id=3436 题意: 每台计算机包含P个部件,当所有这些部件都准备齐全后,计算机就组装完成了.计算机的生产过程通过N台不同的机器来完成,每台机器用它的性 ...

  4. POJ - 3436 ACM Computer Factory(最大流+输出残余网络)

    题目链接:点击查看 题目大意:给出n个机器以及m个零件,m个零件分别代表电脑上的零件,每一个机器可以将电脑上零件的一种状态转变为另一种状态,并且每个机器都有单独的效率,现在对于每一个单独的零件,规定状 ...

  5. pku 3436 ACM Computer Factory ——最大流 EK

    http://poj.org/problem?id=3436 题意好难懂,有n个工厂加工电脑半成品,半成品电脑需要p个部件. 输入p(需要的部件数) n(工厂数) Qi  (工厂最大生产量)  Si, ...

  6. POJ 3436 ACM Computer Factory

    传送门:https://vjudge.net/problem/POJ-3436 题目大意: 每台电脑由p个零件组成,编号1-n.生产电脑完全由N台全自动的机器完成.每台机器能够添加一些零件和移除一些电 ...

  7. POJ3426 ACM Computer Factory——最大流(EK+输出路径)

    点这里 题意: 题目大意就是问把000加工到111(多少个零视输入的P而定)的最大零件个数,并且输出路径.   但是具体的加工规则真的是把我看晕了 然后我们来说说具体的加工规则:N台机器,每台机器能同 ...

  8. [poj 3436]最大流+输出结果每条边流量

    题目链接:http://poj.org/problem?id=3436 大力套kuangbin板过了orz #include<cstdio> #include<cstring> ...

  9. poj 3436 (最大流)

    题意:每台电脑共有p种零件,现在有n台机器,给出n台机器每台需要的一些种类零件当原料(0代表不需要,1代表必须要,2代表可有可无)和输出的产品零件.问怎么安排生产线使生产出来零件可以组装的电脑最多. ...

最新文章

  1. Vue API(directives) 自定义指令
  2. OKR让伟大的企业愿景成为可能
  3. A typical memory leak
  4. 数据仓库—stg层_手把手教你创建BI数据仓库STG层
  5. java和javaweb的区别_javaee, javaweb和javase的区别以及各自的知识体系
  6. 9:34 2009-7-28
  7. mysql weblogic_weblogic连mysql的问题
  8. Ubuntu系统备份和还原,从此避免系统重装
  9. vbe编程真人小代码
  10. 数学模型:传染病模型
  11. h5难做吗_H5如何制作?制作H5是否很难?-
  12. Mac系统安装numpy
  13. vivado添加仿真源文件
  14. JavaScript 中 == 和 === 的区别
  15. phpstudy一直自动停止启动_window10 phpstudy2018 mysql服务重启之后自动停止
  16. Windows下的你画我猜 -- 告别效率低下的目录扫描方法
  17. 计算机硬件创意海报,游戏设计一机搞定 机械师创物者设计本评测
  18. okhttp-OkGo
  19. python 头条新闻机器人_新闻写作机器人的应用及前景展望——以今日头条新闻机器人张小明(xiaomingbot)为例...
  20. 中国的第一封EMAIL与GOOGLE之退出

热门文章

  1. xenserver安装使用
  2. 处理器(CPU)发展简史
  3. 使用Python批量替换指定目录所有文件中的指定文本
  4. [Java] 蓝桥杯ALGO-2 算法训练 最大最小公倍数
  5. L2-018. 多项式A除以B -PAT团体程序设计天梯赛GPLT
  6. 蓝桥杯 ADV-78 算法提高 最长单词
  7. 1012. 数字分类 (20)-PAT乙级真题
  8. C语言二级考试都是从题库抽取吗,c語言二級考試題庫_全國計算機等級考試二級C語言的考試題目都是從《C語言題庫》裡面抽取的題目嗎_淘題吧...
  9. python环境安装opencv_服务器python环境和opencv安装方法
  10. js判断null_JavaScript中的undefined和null