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 ...
随机推荐
- IOCP数据中间件
IOCP数据中间件 每包最大8K(8192字节),超过8187字节的数据要分包传输 首包有5个字节的包头:4字节数据长度(告诉对方,此次总共将传输几字节数据) + 1字节命令字(告诉对方,此次请求的何 ...
- 【python】Python的字典get方法:从字典中获取一个值
转自: http://blog.sina.com.cn/s/blog_6be89284010183xm.html
- 【转】c++ 如何批量初始化数组 fill和fill_n函数的应用
http://blog.csdn.net/sunquana/article/details/9153213 一. fill和fill_n函数的应用: fill函数的作用是:将一个区间的元素都赋予val ...
- VC++如何折叠代码
工具-选项,然后在文本编辑器,C/C++中的格式设置,把大纲语句块设置为True 这样之后,还是不能像C#一样使用region折叠代码,但是可以方法和if语句都会自动显示可以折叠. 使用#pr ...
- 【Mongodb教程 第四课 】MongoDB 创建集合
reateCollection() 方法 MongoDB db.createCollection(name, options) 是用来创建集合. 语法: 基本的 createCollection() ...
- MYSQL 增加字段不报错,插入数据不报错处理
') ON DUPLICATE KEY UPDATE sort_name = "vipset"; 重点在 ON DUPLICATE KEY UPDATE sort_name = & ...
- android中init.rc文件的解析问题
init.rc中文件里会通过import /init.${ro.hardware}.rc文件,这个ro.hardware应该是某个详细的属性.而这个ro.hardware赋值应该是在Init进程中赋值 ...
- su 和 su- 会影响环境变量
大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令,需要root身份才能进行,这就需要从当前用户切换到root用户,Linux中切换用户的命令是su或su -,下面就su命令和 ...
- javaScript改变HTML
改变HTML输出流: 在JavaScript中,document.write() 可用于直接向HTML输出流写内容 <!DOCTYPE html> <html> <bod ...
- YTU 2954: A改错题--是虫还是草
2954: A改错题--是虫还是草 时间限制: 1 Sec 内存限制: 128 MB 提交: 83 解决: 55 题目描述 冬虫夏草为虫体与菌座相连而成,冬天是虫子,夏天却是草.根据类生物(bio ...