https://vjudge.net/problem/POJ-3436

题目描述: 

  正如你所知道的,ACM 竞赛中所有竞赛队伍使用的计算机必须是相同的,以保证参赛者在公平的环境下竞争。这就是所有这些计算机都是同一个厂家生产的原因。 每台ACM 计算机包含P 个部件,当所有这些部件都准备齐全后,计算机就可以组装了,组装好以后就可以交给竞赛队伍使用了。计算机的生产过程是全自动的,通过N 台不同的机器来完成。每台机器从一台半成品计算机中去掉一些部件,并加入一些新的部件(去除一些部件在有的时候是必须的,因为计算机的部件不能以任意的顺序组装)。每台机器用它的性(每小时组装多少台计算机)、输入/输出规格来描述。

输入规格描述了机器在组装计算机时哪些部件必须准备好了。输入规格是由P 个整数组成, 每个整数代表一个部件,这些整数取值为0, 1 或2,其中0 表示该部件不应该已经准备好了,1表示该部件必须已经准备好了,2 表示该部件是否已经准备好了无关紧要。

输出规格描述了该机器组装的结果。输出规格也是由P 个整数组成,每个整数取值为0 或1,其中0 代表该部件没有生产好,1 代表该部件生产好了。 机器之间用传输速度非常快的流水线连接,部件在机器之间传送所需的时间与机器生产时间相比是十分小的。

经过多年的运转后,ACM 计算机工厂的整体性能已经远远不能满足日益增长的竞赛需求。因此ACM 董事会决定升级工厂。升级工厂最好的方法是重新调整流水线。ACM 董事会决定让你来解决这个问题。

求大最流,然后输出机器之间流量增加的边

思路:

网络流模型:

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<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
const int MAXN= ;//最大顶点数
const int MAXM = ;//最大边数
const int INF=0x3f3f3f3f;
using namespace std;
vector<pair<int,pair<int,int> > >pi;
int n,s,t,N;
struct Edge{
int to,next,cap,flow;
}edges[MAXM];
int head[MAXN],tot,gap[MAXN],d[MAXN],cur[MAXN],que[MAXN],p[MAXN];
void init(){
tot=;
memset(head,-,sizeof(head));
}
void addedge(int u,int v,int c){
edges[tot].to=v;
edges[tot].cap=c;
edges[tot].flow=;
edges[tot].next=head[u];
head[u]=tot++;
edges[tot].to=u;
edges[tot].cap=;
edges[tot].flow=;
edges[tot].next=head[v];
head[v]=tot++;
}
void bfs(){
memset(d,-,sizeof(d));
memset(gap,,sizeof(gap));
gap[]=;
int front=,rear=;
d[t]=;
que[rear++]=t;
while(front!=rear){
int u=que[front++];
for(int i=head[u];i!=-;i=edges[i].next){
int v=edges[i].to;
if(d[v]!=-) continue;
que[rear++]=v;
d[v]=d[u]+;
gap[d[v]]++;
}
}
}
int isap(){
bfs();
memcpy(cur,head,sizeof(head));
int top=,x=s,flow=;
while(d[s]<N){
if(x==t){
int Min=INF,inser;
for(int i=;i<top;++i){
if(Min>edges[p[i]].cap-edges[p[i]].flow){
Min=edges[p[i]].cap-edges[p[i]].flow;
inser=i;
}
}
for(int i=;i<top;++i){
edges[p[i]].flow+=Min;
edges[p[i]^].flow-=Min;
}
flow+=Min;
top=inser;
x=edges[p[top]^].to;
continue;
}
int ok=;
for(int i=cur[x];i!=-;i=edges[i].next){
int v=edges[i].to;
if(edges[i].cap>edges[i].flow&&d[v]+==d[x]){
ok=;
cur[x]=i;
p[top++]=i;
x=edges[i].to;
break;
}
}
if(!ok){
int Min=N;
for(int i=head[x];i!=-;i=edges[i].next){
if(edges[i].cap>edges[i].flow&&d[edges[i].to]<Min){
Min=d[edges[i].to];
cur[x]=i;
}
}
if(--gap[d[x]]==) break;
gap[d[x]=Min+]++;
if(x!=s) x=edges[p[--top]^].to;
}
}
return flow;
}
int P;
struct Node{
int p[];
int Q;
}node[MAXN];
bool check_edge(int i,int j){
for(int k=;k<P;++k){
if(node[j].p[k]+node[i].p[k]==) return false;//0-1搭配时
}
return true;
}
bool check_s(int i){
for(int k=;k<P;++k){
if(node[i].p[k]==) return false;
}
return true;
}
bool check_t(int i){
for(int k=;k<P;++k){
if(node[i].p[k]==) return false;
}
return true;
}
void Build_graph(){//建图
s=,t=(n<<)+;
N=t+;
for(int i=;i<=n;++i){
if(check_s(i)) addedge(s,i,INF);//和只有0,2的接收点连接
addedge(i,i+n,node[i].Q);//接收点和生产点间容量为处理率
if(check_t(i+n)) addedge(i+n,t,INF);//和全1的生产点连接
}
for(int i=;i<=n;++i){
for(int j=;j<=n;++j){
if(j==i) continue;
if(check_edge(i+n,j)) addedge(i+n,j,INF);//生产点和接收点的连接
}
}
}
void solve(){
Build_graph();
printf("%d",isap());
//输出关系
int cnt=;
pi.clear();
//在残量网络中查找流大于0的边
for(int u=n+;u<=(n<<);++u){//生产点标号
for(int i=head[u];i!=-;i=edges[i].next){
Edge&e =edges[i];
int v=e.to;
if(v!=u-n&&v!=t&&e.flow>){
cnt++;
pi.push_back(make_pair(u-n,make_pair(v,e.flow)));
}
}
}
printf(" %d\n",cnt);
for(int i=;i<cnt;++i){
printf("%d %d %d\n",pi[i].first,pi[i].second.first,pi[i].second.second);
}
}
int main(){
while(scanf("%d%d",&P,&n)!=EOF){
init();
for(int i=;i<=n;++i){
scanf("%d",&node[i].Q);
for(int j=;j<P;++j){
scanf("%d",&node[i].p[j]);//接收点
}
for(int j=;j<P;++j){
scanf("%d",&node[i+n].p[j]);//生产点
}
}
solve();
}
return ;
}

POJ - 3436 ACM Computer Factory(最大流)的更多相关文章

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

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

  2. POJ 3436 ACM Computer Factory 最大流,拆点 难度:1

    题目 http://poj.org/problem?id=3436 题意 有一条生产线,生产的产品共有p个(p<=10)零件,生产线上共有n台(n<=50)机器,每台机器可以每小时加工Qi ...

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

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

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

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

  5. POJ - 3436 ACM Computer Factory 网络流

    POJ-3436:http://poj.org/problem?id=3436 题意 组配计算机,每个机器的能力为x,只能处理一定条件的计算机,能输出特定的计算机配置.进去的要求有1,进来的计算机这个 ...

  6. POJ 3436 ACM Computer Factory(最大流+路径输出)

    http://poj.org/problem?id=3436 题意: 每台计算机包含P个部件,当所有这些部件都准备齐全后,计算机就组装完成了.计算机的生产过程通过N台不同的机器来完成,每台机器用它的性 ...

  7. POJ 3436 ACM Computer Factory (拆点+输出解)

    [题意]每台计算机由P个零件组成,工厂里有n台机器,每台机器针对P个零件有不同的输入输出规格,现在给出每台机器每小时的产量,问如何建立流水线(连接各机器)使得每小时生产的计算机最多. 网络流的建图真的 ...

  8. POJ 3436 ACM Computer Factory

    题意:   为了追求ACM比赛的公平性,所有用作ACM比赛的电脑性能是一样的,而ACM董事会专门有一条生产线来生产这样的电脑,随着比赛规模的越来越大,生产线的生产能力不能满足需要,所以说ACM董事会想 ...

  9. 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 ...

随机推荐

  1. uwsgi+django架构程序内部无法获取全局变量

    近期开发了一个djangoi程序,用django自带的python manage.py runserver 0.0.0.0:80 运行方式无任何问题,但用django+nginx+uwsg部署运行有时 ...

  2. 记录:Ubuntu 18.04 安装 tensorflow-gpu 版本

    狠下心来重新装了系统,探索一下 gpu 版本的安装.比较令人可喜的是,跟着前辈们的经验,还是让我给安装成功了.由于我是新装的系统,就像婴儿般纯净,所以进入系统的第一步就是安装 cuda,只要这个不出错 ...

  3. PAT甲题题解-1096. Consecutive Factors(20)-(枚举)

    题意:一个正整数n可以分解成一系列因子的乘积,其中会存在连续的因子相乘,如630=3*5*6*7,5*6*7即为连续的因子.给定n,让你求最大的连续因子个数,并且输出其中最小的连续序列. 比如一个数可 ...

  4. 第二阶段Sprint9

    昨天:重新规划主界面,把视频录制暂放到主页面里 今天:查看有关“共享平台”的资料,看如何实现上传下载功能,并尝试编码, 遇到的问题:看不懂什么意思,照例子做不行,还得需要联网等

  5. Leetcode题库——49.字母异位词分组【##】

    @author: ZZQ @software: PyCharm @file: leetcode49_groupAnagrams.py @time: 2018/11/19 13:18 要求:给定一个字符 ...

  6. Day Six

    站立式会议 站立式会议内容总结 442 今天:实现计划界面的逻辑 遇到的问题:模态框问题 明天:解决上面问题,开始使用动态数据 331 今天:点击添加找到文件 遇到问题:找到文件在app的引入实现 明 ...

  7. Daily Scrum - 12/07

    Meeting Minutes 确认基本完成了UI组件的基本功能的动画实现: 准备开始实行UI组件的合并: 讨论了长期计划算法的难点,以及简单版本的实现方案. 督促大家更新TFS: Burndown ...

  8. ElasticSearch 2 (30) - 信息聚合系列之条形图

    ElasticSearch 2 (30) - 信息聚合系列之条形图 摘要 版本 elasticsearch版本: elasticsearch-2.x 内容 聚合还有一个令人激动的特性就是能够十分容易地 ...

  9. ElasticSearch 2 (21) - 语言处理系列之单词识别

    ElasticSearch 2 (21) - 语言处理系列之单词识别 摘要 一个英语单词相对容易识别:因为英语单词是被空格或(某些)标点符号隔开的.但在英语中也有反例:you're 这个词是一个单词还 ...

  10. 【Leetcode】209. Minimum Size Subarray Sum

    Question: Given an array of n positive integers and a positive integer s, find the minimal length of ...