题意:

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

Sample input

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 output

25 2

1 3 15

2 3 10

输入:电脑由3个部件组成,共有4台机器,1号机器产量15, 能给空电脑加上2号部件,2号 机器能给空电脑加上2号部件和3号部件, 3号机器能把有1个2号部件和3号部件有无均可的电脑变成成品(每种部件各有一个)
输出:单位时间最大产量25,有两台机器有协作关系,
1号机器单位时间内要将15个电脑给3号机器加工
2号机器单位时间内要将10个电脑给3号机器加工

思路:

网络流模型:

1) 添加一个原点S,S提供最初的原料 00000...
2) 添加一个汇点T, T接受最终的产品 11111...
3) 将每个机器拆成两个点: 编号为i的接收节点,和编号为i+n的产出节点(n是机器数目),前者用于接收原料,后者用于提供加工后的半成品或成品。这两个点之间要连一条边,容量为单位时间产量Qi
4) S 连边到所有接收 "0000..." 或 "若干个0及若干个2" 的机器,容量为无穷大
5) 产出节点连边到能接受其产品的接收节点,容量无穷大
6) 能产出成品的节点,连边到T,容量无穷大。
7) 求S到T的最大流

实现:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std; const int INF = 0x3f3f3f3f; int g[][], p, n, q[];
int G[][], G_copy[][], layer[], vis[]; struct node
{
int x, y, c;
}; bool countLayer(int s, int e)
{
layer[s] = ;
queue<int> q;
q.push(s);
memset(vis, , sizeof(vis));
vis[s] = true;
while (!q.empty())
{
int tmp = q.front();
q.pop();
for (int i = ; i <= e; i++)
{
if (G[tmp][i] && !vis[i])
{
layer[i] = layer[tmp] + ;
if (i == e)
{
return true;
}
vis[i] = true;
q.push(i);
}
}
}
return false;
} int dinic(int s, int e)
{
int flow = ;
deque<int> q;
while (countLayer(s, e))
{
memset(vis, , sizeof(vis));
vis[s] = true;
q.push_back(s);
while (!q.empty())
{
int tmp = q.back();
if (tmp == e)
{
int minn = INF;
int min_index = ;
for (int i = ; i < q.size(); i++)
{
if (G[q[i - ]][q[i]] && G[q[i - ]][q[i]] < minn)
{
minn = G[q[i - ]][q[i]];
min_index = i - ;
}
}
for (int i = ; i < q.size(); i++)
{
G[q[i - ]][q[i]] -= minn;
G[q[i]][q[i - ]] += minn;
}
while (q.size() && q.back() != min_index)
{
vis[q.back()] = false;
q.pop_back();
}
flow += minn;
}
else
{
bool flag = false;
for (int i = ; i <= e; i++)
{
if (G[tmp][i] && !vis[i] && layer[i] == layer[tmp] + )
{
vis[i] = true;
q.push_back(i);
flag = true;
break;
}
}
if (!flag && q.size())
{
q.pop_back();
}
}
}
}
return flow;
} int main()
{
while (cin >> p >> n)
{
for (int i = ; i < n; i++)
{
cin >> q[i];
for (int j = ; j < p; j++)
{
cin >> g[i][j];
}
for (int j = ; j < p; j++)
{
cin >> g[i + n][j];
}
}
memset(G, , sizeof(G));
for (int i = ; i < n + ; i++)
{
G[i][i + n] = q[i - ];
}
for (int i = ; i < n + ; i++)
{
bool flag = true;
for (int j = ; j < p; j++)
{
if (g[i - ][j] != && g[i - ][j] != )
{
flag = false;
break;
}
}
if (flag)
{
G[][i] = INF;
}
}
for (int i = n + ; i < * n + ; i++)
{
bool flag = true;
for (int j = ; j < p; j++)
{
if (g[i - ][j] != )
{
flag = false;
break;
}
}
if (flag)
{
G[i][ * n + ] = INF;
}
}
for (int i = n + ; i < * n + ; i++)
{
for (int j = ; j < n + ; j++)
{
bool flag = true;
for (int k = ; k < p; k++)
{
if (!(g[i - ][k] == g[j - ][k] || g[j - ][k] == ))
{
flag = false;
break;
}
}
if (flag)
{
G[i][j] = INF;
}
}
}
for (int i = ; i <= * n + ; i++)
{
for (int j = ; j <= * n + ; j++)
{
G_copy[i][j] = G[i][j];
}
}
cout << dinic(, * n + ) << " ";
int cnt = ;
vector<node> v;
for (int i = n + ; i < * n + ; i++)
{
for (int j = ; j < n + ; j++)
{
if (i - n != j && G[i][j] != G_copy[i][j])
{
cnt++;
node tmp;
tmp.x = i - n - ;
tmp.y = j - ;
tmp.c = G_copy[i][j] - G[i][j];
v.push_back(tmp);
}
}
}
cout << cnt << endl;
for (int i = ; i < v.size(); i++)
{
cout << v[i].x << " " << v[i].y << " " << v[i].c << endl;
}
}
return ;
}

poj3436 Computer Factory的更多相关文章

  1. POJ3436 ACM Computer Factory —— 最大流

    题目链接:https://vjudge.net/problem/POJ-3436 ACM Computer Factory Time Limit: 1000MS   Memory Limit: 655 ...

  2. POJ3436 ACM Computer Factory 【最大流】

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5412   Accepted: 1 ...

  3. POJ-3436 ACM Computer Factory(网络流EK)

    As you know, all the computers used for ACM contests must be identical, so the participants compete ...

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

    POJ 3436 ACM Computer Factory 电脑公司生产电脑有N个机器.每一个机器单位时间产量为Qi. 电脑由P个部件组成,每一个机器工作时仅仅能把有某些部件的半成品电脑(或什么都没有 ...

  5. POJ3436 ACM Computer Factory(最大流/Dinic)题解

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8944   Accepted: 3 ...

  6. POJ3436:ACM Computer Factory(最大流)

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9963   Accepted: 3 ...

  7. poj-3436.ACM Computer Factory(最大流 + 多源多汇 + 结点容量 + 路径打印 + 流量统计)

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10940   Accepted:  ...

  8. POJ 3436 ACM Computer Factory (网络流,最大流)

    POJ 3436 ACM Computer Factory (网络流,最大流) Description As you know, all the computers used for ACM cont ...

  9. POJ 3464 ACM Computer Factory

    ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4829 Accepted: 1641 ...

随机推荐

  1. 阶乘问题(大数阶乘)简单 n! (一个大数与一个小数相乘的算法 、一个大数与一个小数的除法算法 *【模板】 )

    sdut oj 简单n! Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定一个数n(0 <= n <= 150), ...

  2. 解决virtualbox安装增强工具失败的问题

    virtualbox有个增强工具,安装之后用户体验是非常爽的.但是有些时候在安装增强工具会遇到一些小问题,无非是没有安装gcc,make之类的编译工具或是需要安装kernel*.而我遇到的问题在做了这 ...

  3. SET IDENTITY_INSERT 和 DBCC CHECKIDENT

    SET IDENTITY_INSERT (Transact-SQL) Allows explicit values to be inserted into the identity column of ...

  4. WAS:修改jsp编译器用JDK5.0

      问题现象: 今天有现场反映,访问应用的个别页面报错,报错内容如下: 于是先查看其他现场,都是好的:根据报错信息,提示的意思是jsp解析不了. 结合上面2个情况,排除代码问题,应该是现场WAS环境问 ...

  5. 获取cookie值

    function get_cookie(Name) { var search = Name + "=" var returnvalue = ""; if (do ...

  6. BZOJ_1812_[Ioi2005]riv_树形DP

    BZOJ_1812_[Ioi2005]riv_树形DP Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了 ...

  7. Spring 3.1新特性之一:使用Spring Profile和Mybatis进行多个数据源(H2和Mysql)的切换

    最近在做WebMagic的后台,遇到一个问题:后台用到了数据库,本来理想情况下是用Mysql,但是为了做到开箱即用,也整合了一个嵌入式 数据库H2.这里面就有个问题了,如何用一套代码,提供对Mysql ...

  8. Bootstrap-CSS:表格

    ylbtech-Bootstrap-CSS:表格 1.返回顶部 1. Bootstrap 表格 Bootstrap 提供了一个清晰的创建表格的布局.下表列出了 Bootstrap 支持的一些表格元素: ...

  9. lightoj1200 【完全背包】

    题意: 有一个能放W重的袋子,然后妻子给了老公一列清单,每个item会有价格,数量,重量. 首先得满足老婆的要求,然后在可装的地方输出最大还能拿多少使得拿的东西的钱最多. 注意标题是thief,我想大 ...

  10. mongodb 安装问题

    重新安装一台机器时出现头疼的问题,老是说什么 dbpath 不存在 结果最后发现是没有写 mongodb.log 这个log文件名 1. 创建 datas 文件夹  e:\mongodb\datas ...