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 ...
随机推荐
- 关于maven的规则插件:Maven Enforcer plugin
Maven提供了Maven-Enforcer-Plugin插件,用来校验约定遵守情况(或者说校验开发环境).比如JDK的版本,Maven的版本,开发环境(Linux,Windows等),依赖jar包的 ...
- CEF3研究(一)
一.基本概览 C++ WrapperC++Wrapper(包装类)就是将C结构包装C++类. 这是C/C++API转换层通过translator tool自动产生的. 进程 CEF3用多进程运 ...
- [Bash] Create nested folder in Bash
We can create a single folder by doing: mkdir onefolder If we want to create nested folder we need t ...
- BC一周年B
#include <cstdio> #include <iostream> #include <algorithm> #include <queue> ...
- 汝佳大神的紫书上写错了?uva10048
算法竞赛入门经典第二版的365页例题11-5噪音.应该是"之和"换成"取最大值","取最小值"还是取最小值 假设我错了,请大家务必指点小弟 ...
- Java注释中的@deprecated与源代码中的@Deprecated
用 @Deprecated注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择.在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告. 其次,请注意标题, ...
- fedora下安装xdot和objgraph
前提:安装好了python 1.先下载xdot-0.6.tar.gz和objgraph-1.8.0-py27-none-any.whl,你也可以在官网上下载其他版本. 2.下载完后,解压. 3.打开终 ...
- YII获取当前URL
<?php //当前域名 echoYii::app()->request->hostInfo; //除域名外的URL echoYii::app()->request ...
- Codeforces 104C Cthulhu dfs暴力 || 点双连通缩点
题目链接:点击打开链接 题意: 给定n个点m条边的无向图 问图中是否存在 有且仅有一个简单环和一些树,且这些树的root都在这个简单环上. 瞎写了个点双. . == #include <stdi ...
- GCC编译动态和静态链接库例子
我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而是 ...