Poj 3436 ACM Computer Factory (最大流)
题目链接:
题目描述:
n个工厂,每个工厂能把电脑s态转化为d态,每个电脑有p个部件,问整个工厂系统在每个小时内最多能加工多少台电脑?
解题思路:
因为需要输出流水线要经过的工厂路径,如果要用电脑状态当做节点的话,就GG了。所以建图的时候要把工厂当做节点。对于节点i,能生产si电脑的节点可以进入节点i,能转化ei电脑的节点可以由i节点进入。要注意对于每一个节点要进行拆点,防止流量发生错误。
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int maxn = ;
const int INF = 0x3f3f3f3f;
struct node
{
int x, s[], e[];
} mach[maxn];
struct node1
{
int s, e, x;
} path[maxn*maxn];
int maps[maxn*][maxn*], Maps[maxn*][maxn*];
int Layer[maxn*], p, n, num; void buildmaps (int s, int e)
{
for (int i=s; i<=e; i++)
{
int j, k;
for (int j=s; j<=e; j++)
{
if (i == j)
continue;
for (k=; k<p; k++)
{
if (mach[i].e[k]== || mach[j].s[k]==)
continue;
if (mach[i].e[k] != mach[j].s[k])
break;
}
if (k == p)
{
if (i > )
Maps[i+n][j] = mach[i].x;
else
Maps[i][j] = mach[i].x;
}
}
} for (int i=; i<=num; i++)
for (int j=; j<=num; j++)
maps[i][j] = Maps[i][j];
} bool CountLayer (int s, int e)
{
queue <int> Q;
memset (Layer, , sizeof(Layer));
Layer[s] = ;
Q.push (s); while (!Q.empty ())
{ int u = Q.front();
Q.pop(); for (int i=; i<=num; i++)
if (!Layer[i] && maps[u][i])
{
Layer[i] = Layer[u] + ;
Q.push (i);
if (i == e)
return true;
}
}
return false;
} int Dfs (int u, int e, int maxflow)
{
if (u == e)
return maxflow; int uflow = ;
for (int i=; i<=num; i++)
{
if (maps[u][i] && Layer[i]==Layer[u]+)
{
int flow = min(maps[u][i], maxflow - uflow);
flow = Dfs (i, e, flow); uflow += flow;
maps[u][i] -= flow;
maps[i][u] += flow;
if (uflow == maxflow)
break;
}
} if (uflow == )
Layer[u] = ; return uflow;
} int Dinic (int s, int e)
{
int maxflow = ; while (CountLayer(s, e))
maxflow += Dfs(s, e, INF); return maxflow;
} int main ()
{
while (scanf ("%d %d", &p, &n) != EOF)
{
memset (mach, , sizeof(mach));
memset (Maps, , sizeof(Maps));
mach[].x = INF;
for (int i=; i<p; i++)
{
mach[].s[i] = INF;
mach[].e[i] = INF;
mach[].s[i] = ;
} for (int i=; i<n+; i++)
{
scanf ("%d", &mach[i].x);
for (int j=; j<p; j++)
scanf ("%d", &mach[i].s[j]);
for (int j=; j<p; j++)
scanf ("%d", &mach[i].e[j]);
Maps[i][i+n] = mach[i].x;//拆点
} int ans, res;
res = ;
num = n + n + ; buildmaps (, n+);
ans = Dinic (, ); for (int i=; i<num; i++)
{
for (int j=; j<num; j++)
{ if (i == j+n || j==i+n)
continue; if (Maps[i][j] - maps[i][j] > )
{
path[res].x = Maps[i][j] - maps[i][j];
path[res].s = (i - ) % n + ;
path[res++].e = (j - ) % n + ;
} }
} printf ("%d %d\n", ans, res);
for (int i=; i<res; i++)
printf ("%d %d %d\n", path[i].s, path[i].e, path[i].x); }
return ;
}
Poj 3436 ACM Computer Factory (最大流)的更多相关文章
- POJ 3436 ACM Computer Factory 最大流,拆点 难度:1
题目 http://poj.org/problem?id=3436 题意 有一条生产线,生产的产品共有p个(p<=10)零件,生产线上共有n台(n<=50)机器,每台机器可以每小时加工Qi ...
- poj 3436 ACM Computer Factory 最大流+记录路径
题目 题意: 每一个机器有一个物品最大工作数量,还有一个对什么物品进行加工,加工后的物品是什么样.给你无限多个初始都是000....的机器,你需要找出来经过这些机器操作后最多有多少成功的机器(111. ...
- 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(最大流)
https://vjudge.net/problem/POJ-3436 题目描述: 正如你所知道的,ACM 竞赛中所有竞赛队伍使用的计算机必须是相同的,以保证参赛者在公平的环境下竞争.这就是所有这些 ...
- POJ 3436 ACM Computer Factory(最大流+路径输出)
http://poj.org/problem?id=3436 题意: 每台计算机包含P个部件,当所有这些部件都准备齐全后,计算机就组装完成了.计算机的生产过程通过N台不同的机器来完成,每台机器用它的性 ...
- POJ 3436 ACM Computer Factory (拆点+输出解)
[题意]每台计算机由P个零件组成,工厂里有n台机器,每台机器针对P个零件有不同的输入输出规格,现在给出每台机器每小时的产量,问如何建立流水线(连接各机器)使得每小时生产的计算机最多. 网络流的建图真的 ...
- POJ 3436 ACM Computer Factory
题意: 为了追求ACM比赛的公平性,所有用作ACM比赛的电脑性能是一样的,而ACM董事会专门有一条生产线来生产这样的电脑,随着比赛规模的越来越大,生产线的生产能力不能满足需要,所以说ACM董事会想 ...
- kuangbin专题专题十一 网络流 POJ 3436 ACM Computer Factory
题目链接:https://vjudge.net/problem/POJ-3436 Sample input 1 3 4 15 0 0 0 0 1 0 10 0 0 0 0 1 1 30 0 1 2 1 ...
随机推荐
- Spring @Value用法
Spring 通过注解获取*.porperties文件的内容,除了xml配置外,还可以通过@value方式来获取. 使用方式必须在当前类使用@Component,xml文件内配置的是通过pakage扫 ...
- java 定时备份数据库
原文:http://www.open-open.com/code/view/1447490829678 /** 操作数据库 */ public class BackupDb { public Stri ...
- 基于unicorn-engine的虚拟机的实现(WxSpectre)
反病毒虚拟机是一个很有优势的工具,可以说反病毒软件是否存在模拟器是衡量反病毒软件能力的一个指标.反病毒虚拟机不光是内嵌在反病毒软件内部,来动态执行样本.这种虚拟机一般也可以单独用来动态执行批量样本,检 ...
- GPIO简介
GPIO(General Purpose I/O Ports)意思为通用输入/输出端口,通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平. GPIO口一是 ...
- 配置activeMQ
一.加入以下的库 并配置好路径 ws2_32.lib;Mswsock.lib;cppunit.lib;libapr-1.lib;libapriconv-1.lib;libaprutil-1.lib;l ...
- 3.将maven项目jar纳入maven仓库,Mave项目依赖另外一个Maven项目的案例
1 若想让maven项目依赖另外一个maven项目.被依赖的项目要在maven仓库中有对应的jar包,所以要对依赖的项目运行mvninstall命令. 2 新建第二个项目模块HelloFrien ...
- EditText设置光标位置问题
普通设置 EditText 光标显示位置的方法就是 et.setSelection(text.length()); et.setSelection(0); 设置0 就是第一位了. 设置text长度就最 ...
- 行转列--Excel和数据库的完美结合
入职到如今已经有一段时间了,除了不断完好新功能外,线上运维也是一项非常重要的任务,每天都须要占用一 定量的时间来处理,这时候如何高效准确的来解决这些问题是非常值得考虑的. 今天客服人员给我 ...
- aix用户登录次数受限问题(3004-300 输入了无效的登录名或password)
当登录AIX系统.username或password不对以至于多次登录,超过系统设定的次数,怎样解锁: 1.用root用户登录系统 2.chuser unsuccessful_login_count= ...
- [读书笔记]《没人会告诉你的PPT真相》
这本书分了三部分.第一部分偏重于基础技能,其中分为三部分,打印.放映.保存.第二部分是进阶,分为模板下载.模板修改.增加自定义页面等.第三部分是打造商业范的PPT,分为商业范的特征,具体技能体现(重复 ...