题意:

电脑公司生产电脑有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. ubuntu16.04和服务器 caffe 安装

    在centos6.X上安装caffe 0.编译安装gcc4.8.5 由于centos6.x中的gcc版本老旧,不支持c++11所以要安装gcc4.8.5,以下是安装教程.参考CentOS 6.4 编译 ...

  2. 如何修改织梦dedecms文章标题的最大长度

    织梦dedecms默认的文章标题的最大长度为60字节,如果文章标题超过60字节将会自动截断,导致标题显示不全,这并非是我们所希望的.那么如何将标题长度改成我们想要的?只需简单两步即可解决问题. 1.进 ...

  3. e.target与e.currentTarget的区别

    在DOM事件对象中有两个属性总是时不时的困扰我,就是target和currentTarget,有时候很迷惑分不清两者的区别,因此有必要把这两个属性好好梳理一下,加深理解,以便日后的查询. MDN中对t ...

  4. hdu 3746 Cyclic Nacklace(next数组求最小循环节)

    题意:给出一串字符串,可以在字符串的开头的结尾添加字符,求添加最少的字符,使这个字符串是循环的(例如:abcab 在结尾添加1个c变为 abcabc 既可). 思路:求出最小循环节,看总长能不能整除. ...

  5. mysql 5.5升级到5.7版本操作流程

    一.备份原来 phpStudy 中 MySQL 安装目录 二.把下载的 MySQL 压缩文件解压至 phpStudy 下的 MySQL目录,复制 my-default.ini ,重命名为 my.ini ...

  6. sql注入原理与实践

    转自:http://blog.csdn.net/stilling2006/article/details/8526458 1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开 ...

  7. Watir: Watir webdriver对JS 弹出框的操作现在非常简单。

    以下代码支持Firefox,IE,Chrome require 'watir-webdriver' #require "watir-webdriver/extensions/alerts&q ...

  8. 洛谷 P1337 平衡点 & bzoj 3680 吊打 XXX —— 模拟退火

    题目:https://www.luogu.org/problemnew/show/P1337 https://www.lydsy.com/JudgeOnline/problem.php?id=3680 ...

  9. 动态编译c#脚本(把c#当作脚本执行)

    csscript动态编译C#脚本 This document contains information about the CLR based scripting system CS-Script ( ...

  10. poj2389 普通的大数乘法

    = =.每次这种题目说只有40位 然而要开到100位,心里总是一万匹草泥马在奔腾: #include <iostream> #include <stdio.h> #includ ...