POJ3436(最大流)

POJ3436-ACM Computer Factory 北大POJ3436-ACM Computer Factory 解题报告+AC代码 立即下载
ACM Computer Factory
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 8309 Accepted: 3017 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,1Di,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.

Source

Northeastern Europe 2005, Far-Eastern Subregion

解题思路:把每个工厂拆成两个点,一个点为工厂需要的原料,一个点为工厂的产品,这两个点的容量为Qi,然后将每个工厂的产出点与其他工厂原料点相连(如果两点不矛盾,也就是产出可以作为另一个工厂的原料),容量为无穷大,定义一个源点s,连向所有的000点(不含1的都可以),定义一个汇点t,所有111的点连向这个汇点,这样我们求一个s到t的最大流就行。


#include <stdio.h>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
int p, n;
int s, t;
int tot;
int level[1000];//每个点的层次
bool visit[1000];
int head[1000];
struct Factory{
    int In[15], Out[15], value;
}Fa[60];
struct edge{
    int v, w, last;
}Edge[1000];
struct info{
    int u, v, w;
    bool operator <(const info &res) const {
        if(u == res.u) return v < res.v;
        else return u < res.u;
    }
}Info[1000];
edge Ori[1000];//备份原图
void add(int u, int v, int w)
{
    Edge[tot].v = v;
    Edge[tot].w = w;
    Edge[tot].last = head[u];
    head[u] = tot++;
    //添加反向边
    Edge[tot].v = u;
    Edge[tot].w = 0;
    Edge[tot].last = head[v];
    head[v] = tot++;

}
void init()
{
    tot = 0;
    memset(head, -1, sizeof(head));
    s = 0;
    t = 2 * n + 1;
}
bool judge_s(int x)
{
    for(int i = 1; i <= p; i++)
    {
        if(Fa[x].In[i] == 1) return false;
    }
    return true;
}
bool judge_t(int x)
{
    for(int i = 1; i <= p; i++)
    {
        if(Fa[x].Out[i] != 1) return false;
    }
    return true;
}
bool judge(int x, int y)//判断x工厂的产物是否能作为y工厂的原料
{
    for(int i = 1; i <= p; i++)
    {
        if(Fa[y].In[i] == 2) continue;
        else if(Fa[y].In[i] == 0 && Fa[x].Out[i] == 1) return false;
        else if(Fa[y].In[i] == 1 && Fa[x].Out[i] == 0) return false;
    }
    return true;
}
bool bfs()
{
    queue<int> q;
    while(!q.empty()) q.pop();
    memset(level, -1, sizeof(level));
    memset(visit, false, sizeof(visit));
    q.push(s);
    level[s] = 0;
    while(!q.empty())
    {
        int u = q.front();
        q.pop();
        if(u == t) return true;
        visit[u] = true;
        for(int i = head[u]; i != -1; i = Edge[i].last)
        {
            int v = Edge[i].v;
            if(!visit[v] && Edge[i].w)
            {
                visit[v] = true;
                level[v] = level[u] + 1;
                q.push(v);
            }
        }
    }
    return false;
}
int dfs(int ss, int tt, int ff)
{
    //ss 为起点, tt 为终点, ff为流入起点的流量
    int res = 0;//流入该点后已经使用过的流量
    if(ss == tt) return ff;
    for(int i = head[ss]; i != -1; i = Edge[i].last)
    {
        int v = Edge[i].v;
        int w = Edge[i].w;
        int term = min(ff - res, w);
        if(level[v] == level[ss] + 1 && term)
        {
            int temp = dfs(v, tt, term);
            Edge[i^1].w += temp;
            Edge[i].w -= temp;
            res += temp;
            if(res == ff) return res;
        }
    }
    return res;
}
int Dinic()
{
    int Maxflow = 0;
    while(bfs())
    {
        Maxflow += dfs(s, t, inf);
        //cout<<"Maxflow == "<<Maxflow<<endl;
    }
    return Maxflow;
}
int main()
{
    scanf("%d%d", &p, &n);
    init();
    for(int i = 1; i <= n; i++)
    {
        scanf("%d", &Fa[i].value);
        for(int j = 1; j <= p; j++)
        {
            scanf("%d", &Fa[i].In[j]);
        }
        for(int j = 1; j <= p; j++)
        {
            scanf("%d", &Fa[i].Out[j]);
        }
    }
    //建图
    for(int i = 1; i <= n; i++)
    {
        if(judge_s(i)) add(s, i, inf);
        if(judge_t(i)) add(i, t, Fa[i].value);
        else add(i, i + n, Fa[i].value);
        for(int j = 1; j <= n; j++)
        {
            if(j == i) continue;
            if(judge(i, j)) add(i + n, j, Fa[i].value);
        }
    }
    //备份原图
    for(int i = 0; i < tot; i++)
    {
        Ori[i] = Edge[i];
    }
    //求解最大流
    int Maxflow = Dinic();
    //利用原图进行求解边
    int ans = 0;
    for(int i = 1; i <= n; i++)
    {
        if(judge_t(i)) continue;
        for(int j = head[i + n]; j != -1; j = Edge[j].last)
        {
            int v = Edge[j].v;
            int w = Edge[j].w;
            if(v == i) continue;
            int ww = Ori[j].w;
            if(w == ww) continue;
            Info[++ans].u = i;
            Info[ans].v = v;
            Info[ans].w = ww - w;
        }
    }
    printf("%d %d\n", Maxflow, ans);
    for(int i = 1; i <= ans; i++)
    {
        printf("%d %d %d\n", Info[i].u, Info[i].v, Info[i].w);
    }
    return 0;

}




无人机蜂群作战设计技术详解 构建防御网络,拦截敌方无人机或导弹;无人机蜂群作战设计技术是一种创新的军事应用概念,它基于生物仿生学原理,通过先进的通信技术、自主导航与决策算法,将大量小型、低成本、功能各异的无人机组织成一个高度协同的群体,以执行复杂多样的军事任务。无人机蜂群作战的概念源于自然界中蜜蜂、蚂蚁等生物群体的行为模式,这些生物群体通过简单的个体间的信息交互和分工协作,能够完成远远超出单一个体能力的复杂任务。其中,无人机群体是执行任务的主体,指挥控制系统负责任务分配和决策,通信数据链则保障无人机群体与指挥控制系统之间的信息交换。 阅读详情

相关推荐

电子纸价签实战:基于SSD1680的墨水屏驱动开发与优化

本文详细介绍了基于SSD1680驱动芯片的电子纸价签开发实战,涵盖硬件连接、驱动框架搭建、核心流程解析及性能优化。重点剖析了初始化配置、波形文件加载、图像数据写入与刷新触发等关键步骤,并提供了功耗优化、显示效果提升及代码健壮性等实用避坑指南,帮助开发者高效实现稳定低功耗的墨水屏驱动。

weixin_28278377的博客 231

POJ - 3436 ACM Computer Factory 网络流

POJ-3436:http://poj.org/problem?id=3436 题意   组配计算机,每个机器的能力为x,只能处理一定条件的计算机,能输出特定的计算机配置。进去的要求有1,进来的计算机这个位子就要求为1,进去的要求有0,进来的计算机这个位子就要求为0. 思路 因为点上有容量限制,所以把每个点拆掉,连一条容量为这个机器的能力的边。源点向要求为0的机器连容量inf的边,把能完全...

weixin_30451709的博客 146

遗传算法优化光学超表面:智能设计突破纳米结构瓶颈

光学超表面设计本质上是一个高维、非线性、离散每个结构单元(如纳米砖柱、孔洞、十字架)有多个参数(长、宽、高、旋转角、材料),整个阵列的参数组合数量随单元数指数级增长。性能指标(如聚焦效率、工作带宽、偏振转换率、特定角度响应)往往无法用简单解析式表达,需依赖计算密集型电磁仿真(如FDTD, FDFD, RCWA)来评估。结构参数微小变化可能引起光学响应的剧烈跃变,目标函数存在多个局部最优解。实际制造通常要求结构参数取自有限的离散值(如特定刻蚀深度、材料库)。

weixin_51101456的博客 1142

poj - 3436 最大流dinic + 拆点 + 输出路径

题意: 第一行给你P和N, P表示配件的个数, N表示机器的数量,机器可用来组装电脑,把进来时拥有的配件变成出去时的配件 第二行首先给你一个数, 表示这个机器一天最大的组装量, 后面是2 * P 个数             1 ~ P表示电脑进入这个机器的配件要求, 0表示不能有这个配件, 1表示必须有这个配件, 2表示可有可无;             P + 1 ~ 2 * P表示电...

陌离将离 550

MIT Bevfusion环境安装 Docker方式,nuscenes数据处理

Bevfusion环境安装,数据生成报错解决module 'numpy' has no attribute 'long';most likely due to a circular import。bevfusion docker环境

Jack_Man_N的博客 1144

Xshell 连接 VMware虚拟机操作 截图和使用

vmwareVMware总部位于美国加州帕洛阿尔托(Palo Alto),是全球云基础架构和移动商务解决方案厂商,提供基于VMware的解决方案,企业通过数据中心改造和公有云整合业务,借助企业安全转型维系客户信任,实现任意云端和设备上运行、管理、连接及保护任意应用Xshell(安全终端模拟软件)Xshell [1]是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。

小 tom的博客 802

poj 3436 ACM Computer Factory

http://poj.org/problem?id=3436 网络流 最重要的是要建图呀 由于速度的限制 要进行拆点 然后求解就可以了 需要注意的地方 1,和原点相连的点 满足进入它的各零件要求是0或2 2,和终点相连的点 需要用拆点后的后一个点连接 代码: #include<iostream> #include<stdio.h> #inclu...

weixin_30916125的博客 119

【白话系列】倍增算法

【序言】         我认为吧,所有能够优化复杂度的算法都是神奇的,所有能够化繁琐为形象的文字都是伟大的。一直觉得倍增算法是个很神奇的东西,所以决定写点东西纪念一下它。但是作为一个非常不称职的OIER,我非常讨厌在看别人的算法解析时整版的i,j,k等我看到鼠标就惯性移到右上角的符号语言,所以我想用最形象的方式来纪念它。 【一】         从前,有一只可爱得不得了的小白兔,它想从

JarjingX 3万+

POJ - 3436 ACM Computer Factory 最大流,拆点,输出路径,dinic

题目链接 POJ-3436 题意 有n个工厂加工商品,商品有m个零件,工厂有最大产能q。告诉你每个工厂能接受加工成什么样子的半成品,以及经这个工厂加工之后的产品情况,问最大能生产多少商品。 思路 看网上题解大多拆点,我这咋没拆。。 最大流题目,关键在于建图,建立超级源汇,源点向所有可以从0开始加工的工厂连边(具体到输入数据,就是输入的m个零件都为0或者2),容量为最大产能q。所有加工完毕的工厂(产出的m个零件都为1的)向汇点连边,容量为最大产能q。再枚举每个工厂A,向所有能接受这个A厂产品的工厂B连边(A厂

TheSunspot的博客 392

kaggle学习笔记-餐厅数据挖掘

分析Zomato数据集的基本思想是为了公平地了解影响在班加罗尔不同地方建立不同类型餐厅的因素,每个餐厅的总评级,班加罗尔是这样一个城市,拥有超过12,000家餐厅,餐厅供应来自世界各地的菜肴。每天都有新的餐馆开业,这个行业还没有饱和,需求也在与日俱增。然而,尽管需求不断增加,新餐馆却很难与老牌餐馆竞争。大多数餐厅都供应同样的食物。班加罗尔是印度的IT之都。这里的大多数人主要依靠餐馆的食物,因为他们没有时间自己做饭。由于对餐馆的需求如此巨大,因此研究一个地方的人口统计学就变得很重要。

优快云XXCQ的博客 1862

QT如何使用CTK插件搭建应用程序框架?

CTK框架,QT框架,插件系统

cs821984831的博客 735

Poj3436——ACM Computer Factory(最大流)

题意: 流水线上有N台机器装电脑,电脑有P个部件组成,每台机器有三个参数,产量,输入规格,输出规格;输入规格中0表示改部件不能有,1表示必须有,2无所谓;输出规格中0表示该部件没有,1表示有。问如何安排流水线使电脑产量最高。 思路: 每个机器都是一个结点,点上有容量。拆点,中间连一条边,容量设为产量。然后根据输入规格和输出规格建立网络。跑最大流,有流量的边就是方案中包含的边。 #include &...

CY05627的博客 266

MOS管的体二极管在LLC中的作用

MOSFET是一个三端器件(G、D、S),在N沟道MOSFET的结构中,源极和漏极之间的N型材料中自然形成了一个寄生的PN结,这个PN结就是体二极管(Body Diode),它是不可避免的器件结构。📌 对于N沟MOSFET:体二极管是从漏极 D 到源极 S 的正向导通二极管,方向为 D → S。MOS管的体二极管在LLC中并不是主功率通道,但却是实现软开关(ZVS)和能量过渡的关键“临时路径”。用得好,它是你的朋友;忽略它,电路就可能烧毁。

weixin_43199439的博客 700

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

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

POJ 3436 ACM Computer Factory 链接:http://poj.org/problem?id=3436 题意:每台电脑有P部分,可以通过不同的机器来进行加工。有N台机器,每台机器用2 P +1 个整数来描述:Qi  Si,1  Si,2 ...  Si,p  Di,1  Di,2. ..  Di,p,其中Qi 指定了机器的性能,表示每小时加工的电脑数量。Si,j

SIOFive的专栏 1485

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

[POJ 3436]ACM Computer Factory[最大流][打印路径]

题目链接:[POJ 3436]ACM Computer Factory[最大流][打印路径] 题意分析: 组装一台电脑需要P个部件,现在有N个生产线,每个生产线分三部分的描述:第一个数字代表,这台机器单位时间能接收多少部件,后面的前p个部分代表该生产线需要什么部件,0代表不需要,1代表需要,2代表可有可无(相当于不需要),后p个部分代表产生什么部件,0不产生,1产生。问,怎么样调动这些材料,让整

闲停 1538

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

POJ 3436 ACM Computer Factory 最大流输出路径

题目:http://poj.org/problem?id=3436 题意:题意真心很难懂啊。。。产品有p个状态,给定n个机器,给出每个机器要求加工前的状态是什么,且给出加工后的状态是什么。产品初始时状态全部为0,完成加工时状态全部为1。加工前有三种状态,为0和1状态要求产品的对应位置也要是0和1,2状态的话可以随意,加工后只有0和1状态 思路:拆点建图,然后在从汇点出发搜索残余网络中的反向边,

弱智就要多努力 951

POJ - 3436 ACM Computer Factory ( 最大流 )

POJ - 3436 题意:... 大意就是有几台机器可以把半成品加工成成品或者另外的半成品,问你最终每小时得到的最多的成品。 思路:那么由题目,这个机器出来的零件个数和另一个机器需要的零件相同时(2的位置不算),他们肯定有条线,但是这里可以看出,对机器每小时有限制数量,这是对点有限制,而不是对边有限制,所以需要拆点,我第一遍写的时候没拆,但是过了,估计数据比较弱..... 没拆点的: #

shinimashzi 293

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

POJ 3436 ACM Computer Factory 电脑公司生产电脑有N个机器,每个机器单位时间产量为Qi。 电脑由P个部件组成,每个机器工作时只能把有某些部件的半成品电脑(或什么都没有的空电脑)变成有另一些部件的半成品电脑或完整电脑(也可能移除某些部件)。求电脑公司的单位时间最大产量,以及哪些机器有协作关系,即一台机器把它的产品交给哪些机器加工。 Sample

天亮说晚安 2270

直接用bfs来求最大流 poj3436

poj3436 求最大流的问题 虚拟出一个源点 和汇点 然后把输入都为0或者2的机器和源点相连接 把输出都为1的机器和汇点相连接 然后根据机器之间的信息把各个机器的输出和输入相链接 这里值得注意的是 每台机器的输入和输出之间也有链接 大小为每台机器每小时的产量#include <iostream> #include <deque> #include <algorithm> #

专栏 634

ACM Computer Factory POJ - 3436 (最大流 && 输出路径)

ACM Computer Factory POJ - 3436 (最大流 &amp;&amp; 输出路径) 题目链接 题目大意:有N台机器,每台机器有P部分,每部分都有各自的输入、输出规格,因此一台机器有P个输入规格,P个输出规格。每台机器有2*P+1种参数去描述:第一个参数Q:该机器的容量;接下来P个参数S:该机器各部分的输入规格;接下来P个参数D:该机器各部分的输出规格。 其中输入规格有...

deerly_的博客 319

POJ 3436:ACM Computer Factory(最大流记录路径)

http://poj.org/problem?id=3436 题意:题意很难懂。给出P N。接下来N行代表N个机器,每一行有2*P+1个数字 第一个数代表容量,第2~P+1个数代表输入,第P+2到2*P+1是代表输出 输入有三种情况,0,1,2.输出有0,1两种情况输入0代表不能有这个接口,1代表必须要有这个接口,2代表这个接口可有可无。输出0代表有这个接口,1代表没有这个接口。大概输出就是...

weixin_30822451的博客 104

POJ-3436 ACM Computer Factory 最大流

  题目链接:http://poj.org/problem?id=3436   题目噼里啪啦说了一大堆= =,其实很简单。对每个点拆点u-v,然后加限制容量,如果两个点之间可行,那么加边,容量INF,最后加源点s和汇点t,建立有向图后,求大流。只是这个题目的建图有点麻烦,果断用3进制优化后,内存减少了很多,处理上也方便了很多。 1 //STATUS:C++_AC_0MS_180KB ...

weixin_30892763的博客 120

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

题目链接:http://poj.org/problem?id=3436 大力套kuangbin板过了orz #include<cstdio> #include<cstring> using namespace std; const int MAXN = 210; const int MAXM = 40010; const int INF = ...

weixin_30663391的博客 158

poj3436 ACM Computer Factory

poj3436 ACM Computer Factory 题意:   n个工厂加工电脑,电脑有p个部件。每个工厂加工的电脑必须是满足它对原材料的需求。p个部件,0代表不能有,1必须有,2代表可有可无。然后经过加工后,这个工厂输出的电脑各个部件的情况,0代表没有,1...

banggui5839的博客 258
上一篇: 864F(tarjan思想)
下一篇: POJ3281(最大流)
creatorx
博客等级 码龄10年 127粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值