POJ 3436 ACM Computer Factory

电脑公司生产电脑有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号机器加工

数据规模非常小,用EdmondsKarp就能够了。主要题目不仅要求最大流的值还要输出有流流过的边。

细致想一想。这题不用拆点!

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector> using namespace std; typedef long long LL;
const int maxn = 60;
const int inf = 0x7fffffff; struct Edge {
int from,to,cap,flow;
Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f) {}
};
struct EdmondsKarp {
int n,m;
vector<Edge> edges;
vector<int> G[maxn];
int p[maxn];
int a[maxn]; void init(int n)
{
this->n=n;
for(int i=0; i<n; i++)
G[i].clear();
edges.clear();
} void AddEdge(int from,int to,int cap)
{
edges.push_back(Edge(from,to,cap,0));
edges.push_back(Edge(to,from,0,0));
m=edges.size();
G[from].push_back(m-2);
G[to].push_back(m-1);
} int Maxflow(int s,int t)
{
int flow=0;
while(true) {
memset(a,0,sizeof(a));
queue<int> Q;
Q.push(s);
a[s]=inf;
while(!Q.empty()) {
int x=Q.front();
Q.pop();
for(int i=0; i<G[x].size(); i++) {
Edge &e=edges[G[x][i]];
if(!a[e.to]&&e.cap>e.flow) {
a[e.to]=min(a[x],e.cap-e.flow);
p[e.to]=G[x][i];
Q.push(e.to);
if(e.to==t)
break;
}
}
if(a[t])break;
}
if(!a[t])break;
for(int u=t; u!=s; u=edges[p[u]].from) {
edges[p[u]].flow+=a[t];
edges[p[u]^1].flow-=a[t];
}
flow+=a[t];
}
return flow;
}
}; EdmondsKarp solver; int P, N;
int w[maxn], in[maxn][12], out[maxn][12]; int print[maxn][5], cnt;
int main()
{
int i, j;
bool flag;
while(~scanf("%d%d", &P, &N)) {
int s = 0, t = N+1;
solver.init(N+2);
for(int i=1; i<=N; ++i) {
scanf("%d", &w[i]);
flag = true;
for(j=0; j<P; ++j) {
scanf("%d", &in[i][j]);
if(in[i][j]==1) flag = false;
}
if(flag) solver.AddEdge(s, i, w[i]); flag = true;
for(j=0; j<P; ++j) {
scanf("%d", &out[i][j]);
if(out[i][j]!=1) flag = false;
}
if(flag) solver.AddEdge(i, t, w[i]);
}
for(i=1; i<=N; ++i) {
for(j=1; j<=N; ++j) {
if(i==j) continue;
flag = true;
for(int k=0; k<P; ++k)
if(out[i][k] + in[j][k] == 1) {
flag = false;
break;
}
if(flag) solver.AddEdge(i, j, min(w[i], w[j]));
}
} printf("%d ", solver.Maxflow(s, t));
cnt = 0;
for(i=1; i<=N; ++i)
for(j=0; j<solver.G[i].size(); ++j)
{
Edge &e = solver.edges[solver.G[i][j]];
if(e.flow>0 && e.to != t && e.from != s)
{
print[cnt][0] = e.from;
print[cnt][1] = e.to;
print[cnt++][2] = e.flow;
}
}
printf("%d\n", cnt);
for(i=0; i<cnt; ++i)
printf("%d %d %d\n", print[i][0],print[i][1],print[i][2]);
}
return 0;
}

poj3436 ACM Computer Factory, 最大流,输出路径的更多相关文章

  1. POJ3436 ACM Computer Factory —— 最大流

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

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

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

  3. POJ-3436-ACM Computer Factory(最大流, 输出路径)

    链接: https://vjudge.net/problem/POJ-3436#author=0 题意: 为了追求ACM比赛的公平性,所有用作ACM比赛的电脑性能是一样的,而ACM董事会专门有一条生产 ...

  4. POJ3436 ACM Computer Factory(最大流)

    题目链接. 分析: 题意很难懂. 大体是这样的:给每个点的具体情况,1.容量 2.进入状态 3.出去状态.求最大流. 因为有很多点,所以如果一个点的出去状态满足另一个点的进入状态,则这两个点可以连一条 ...

  5. POJ-3436 ACM Computer Factory 最大流 为何拆点

    题目链接:https://cn.vjudge.net/problem/POJ-3436 题意 懒得翻,找了个题意. 流水线上有N台机器装电脑,电脑有P个部件,每台机器有三个参数,产量,输入规格,输出规 ...

  6. poj 3436 ACM Computer Factory 最大流+记录路径

    题目 题意: 每一个机器有一个物品最大工作数量,还有一个对什么物品进行加工,加工后的物品是什么样.给你无限多个初始都是000....的机器,你需要找出来经过这些机器操作后最多有多少成功的机器(111. ...

  7. POJ3436 ACM Computer Factory 【最大流】

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

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

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

  9. Poj 3436 ACM Computer Factory (最大流)

    题目链接: Poj 3436 ACM Computer Factory 题目描述: n个工厂,每个工厂能把电脑s态转化为d态,每个电脑有p个部件,问整个工厂系统在每个小时内最多能加工多少台电脑? 解题 ...

随机推荐

  1. solrj索引操作

    添加索引 Solr添加文档至索引: http://www.cnblogs.com/dennisit/p/3621717.html 删除索引: 每天索引记录有一个唯一标识,索引的删除通过唯一标识操作,如 ...

  2. 【Android开发】之Fragment生命周期

    上一篇博客我们讲到了,Fragment的基本使用,相信大家都已经了解怎么去使用了.如果还有不懂得同学可以去看一下,传送门.现在我们来讲解一下Fragment的生命周期. 一.Fragment的事务 再 ...

  3. Spark弹性分布式数据集RDD

    RDD(Resilient Distributed Dataset)是Spark的最基本抽象,是对分布式内存的抽象使用,实现了以操作本地集合的方式来操作分布式数据集的抽象实现.RDD是Spark最核心 ...

  4. 分布式配置 tachyon 并执行Hadoop样例 MapReduce

    ----------此文章.笔者按着tachyon官网教程进行安装并记录. (本地安装tachyon具体解释:http://blog.csdn.net/u012587561/article/detai ...

  5. app-framework学习--官网地址及demo下载地址

    一起学习共同进步,加油..! 官网地址:http://app-framework-software.intel.com/ 下载地址:http://download.csdn.net/detail/ha ...

  6. C++栈学习——顺序栈和链栈的差别

    C++中栈有顺序栈和链栈之分.在顺序栈中,定义了栈的栈底指针(存储空间首地址base).栈顶指针top以及顺序存储空间的大小stacksize(个人感觉这个数据成员是能够不用定义的) //顺序栈数据结 ...

  7. javascript解析JSON---将字符串转换为json对象

    <script type="text/javascript">       var str = '{"name":"jack", ...

  8. Python 爬虫 大量数据清洗 ---- sql语句优化

    . 问题描述 在做爬虫的时候,数据量很大,大约有五百百万条数据,假设有个字段是conmany_name(拍卖公司名称),我们现在需要从五百万条数据里面查找出来五十家拍卖公司, 并且要求字段 time( ...

  9. [LintCode] Subarray Sum & Subarray Sum II

    Subarray Sum Given an integer array, find a subarray where the sum of numbers is zero. Your code sho ...

  10. RecyclerView 作为聊天界面,被键盘遮挡的解决办法

    最近项目在重构,使用 RecyclerView 替换了 ListView 作为 IM 的聊天界面.然后遇到了一个问题就是当键盘弹出来的时候,键盘会遮挡住 RecyclerView 的一部分,造成聊天内 ...