题目链接:https://cn.vjudge.net/problem/POJ-3436

题意

懒得翻,找了个题意。

流水线上有N台机器装电脑,电脑有P个部件,每台机器有三个参数,产量,输入规格,输出规格;输入规格中0表示改部件不能有,1表示必须有,2无所谓;输出规格中0表示改部件没有,1表示有。问如何安排流水线(如何建边)使产量最高。

思路

建图如下



说一下为什么要拆点,若不拆点:

当每台机器节点的入度大于1且出度大于1时,经过这个节点的流量没法限制在容量下。

提交过程

AC

代码

#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=50+20, INF=1e8;
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 Dinic{
int n, m, s, t;
vector<int> G[maxn];
vector<Edge> edges;
bool vis[maxn];
int dep[maxn], cur[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);
}
bool bfs(void){
memset(vis, false, sizeof(vis));
queue<int> Q;
vis[s]=true;
dep[s]=0; Q.push(s);
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(!vis[e.to] && e.cap>e.flow){
vis[e.to]=1;
dep[e.to]=dep[x]+1;
Q.push(e.to);
}
}
}
return vis[t];
}
int dfs(int x, int a){//a当前为止所有弧的最小残量
if(x==t || a==0)return a;
int flow=0, f;
for(int &i=cur[x];i<G[x].size();i++) {//cur当前弧优化
Edge &e=edges[G[x][i]];
if(dep[e.to]==dep[x]+1 && (f=dfs(e.to, min(a, e.cap-e.flow)))>0){
e.flow+=f;
edges[G[x][i]^1].flow-=f;
flow+=f;
a-=f;
if(a==0)break;
}
}
return flow;
}
int maxFlow(int s, int t){
this->s=s; this->t=t; int flow=0;
while(bfs()){
memset(cur, 0, sizeof(cur));
flow+=dfs(s, INF);
}
return flow;
}
void bugs(void){
for (int i=0; i<=n; i++){
printf("%d: ", i);
for (int j=0; j<G[i].size(); j++)
if (edges[G[i][j]].cap!=0)
printf("%d(%d) ", edges[G[i][j]].to, edges[G[i][j]].cap);
printf("\n");
}
} void show(int st, int end){
int from[maxn*maxn], to[maxn*maxn], flow[maxn*maxn];
int size=0;
int ans=maxFlow(0, 1); if (ans==0){
printf("0 0\n");
return;
} for (int i=st; i<=end; i++){
for (int j=0; j<G[i].size(); j++){
Edge &e=edges[G[i][j]];
if (e.cap==INF && e.flow>0 && e.from!=0 && e.to!=1){
from[size]=e.from;
to[size]=e.to;
flow[size++]=e.flow;
}
}
} printf("%d %d\n", ans, size);
for (int i=0; i<size; i++)
printf("%d %d %d\n", from[i]/2, to[i]/2, flow[i]);
}
}dinic; int n, m, in[maxn][15], out[maxn][15], cap[maxn];
bool match(int j, int i){
for (int k=0; k<m; k++)
if (out[j][k]!=in[i][k] && in[i][k]!=2)
return false;
return true;
} void makeGraph(void){
for (int i=2; i<=n+1; i++){
dinic.addEdge(i*2-2, i*2-1, cap[i]);
for (int j=2; j<=n+1; j++) if (i!=j){
if (match(j, i)) dinic.addEdge(j*2-1, i*2-2, INF);
}
if (match(0, i)) dinic.addEdge(0, i*2-2, INF);
if (match(i, 1)) dinic.addEdge(i*2-1, 1, INF);
}
} int main(void){
int from, to, tmp;
while (scanf("%d%d", &m, &n)==2 && n){
dinic.init(n*2+1); for (int i=0; i<m; i++) in[1][i]=1;
for (int i=0; i<m; i++) out[0][i]=0;
for (int i=2; i<=n+1; i++){
scanf("%d", &cap[i]);
for (int j=0; j<m; j++) scanf("%d", &in[i][j]);
for (int j=0; j<m; j++) scanf("%d", &out[i][j]);
} makeGraph();
// dinic.bugs();
dinic.show(2, n*2+1);
} return 0;
}
Time Memory Length Lang Submitted
208kB 3993 C++ 2018-08-17 04:42:53

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(最大流)

    https://vjudge.net/problem/POJ-3436 题目描述:  正如你所知道的,ACM 竞赛中所有竞赛队伍使用的计算机必须是相同的,以保证参赛者在公平的环境下竞争.这就是所有这些 ...

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

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

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

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

  9. POJ 3436 ACM Computer Factory

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

  10. 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. php--方便好用的函数

    在写代码的时候经常会遇见各种各样的问题,感觉需要写函数解决,其实php中已经给出指定函数了.这些函数就需要我们日常去了解记忆. 1.获取指点年份中某月的天数 cal_days_in_month() & ...

  2. ZBrush2018中文版全球同步发售,终身授权

    ZBrush 2018于2018.3.28发布了!这个我们期待已久的2018新版本等了几年,它终于来了! 不负众望,ZBrush 2018的这一次更新,简直炸裂,新功能真是太好用了!2018版是ZBr ...

  3. 其他信息: 具有固定名称“Npgsql”的 ADO.NET 提供程序未在计算机或应用程序配置文件中注册或无法加载。有关详细信息,请参阅内部异常

    其他信息: 具有固定名称“Npgsql”的 ADO.NET 提供程序未在计算机或应用程序配置文件中注册或无法加载.有关详细信息,请参阅内部异常 解决方法 在 App.config 的 configur ...

  4. JS取出特定字符前后的字符串,针对一串字符里面的单个字符前后的字符串

    //针对一串自负里面的单个字符前后的字符串<!doctype html> <html> <head> <meta charset="utf-8&qu ...

  5. luogu 自适应Simpson1

    自适应simpson1 题意 求一个定积分 (可以手推公式,但是我不想推怎么办) 解法 用一个又一个的二次函数覆盖原函数,则可以近似的得到原函数的积分.(这就是Simpson) 模板在下面: #inc ...

  6. 四、服务器上的 Git

    一个远程仓库通常只是一个裸仓库(bare repository)— 即一个没有当前工作目录的仓库.因为该仓库仅仅作为合作媒介,不需要从磁碟检查快照:存放的只有 Git 的资料.简单的说,裸仓库就是你专 ...

  7. Python学习笔记(5)practice:shopping_cart

    2019-02-27 原代码: money = int(input("请输入金额:")) list = ["phone", "clothes" ...

  8. IDEA Maven Web项目 clone到本地导入到Eclipse中,启动服务器的时候会出现这个错误:SEVERE: Exception starting filter [hiddenHttpMethodFilter]

    背景(Background): 我将一个IDEA的maven web项目clone到本地,并导入到Eclipse中. I imported a MAVEN WEB project which was ...

  9. 常见的版本号及Springcloud的版本

    谈谈软件版本号的认识 一.常见版本号说明 举个瓜:2.0.3 RELEASE 2:主版本号,当功能模块有较大更新或者整体架构发生变化时,主版本号会更新 0:次版本号.次版本表示只是局部的一些变动. 2 ...

  10. 前后端分离开发,跨域访问的apche设置

    1,如何让Apache支持跨域访问呢? 步骤: 修改httpd.conf,windows中对应的目录是:C:\wamp\bin\apache\Apache2.4.4\conf\httpd.conf 把 ...