(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦

目录

题意:传送门

 原题目描述在最下面。

 题目真难读懂

  • 有\(n\)台机器,每台机器有\(p\)个部分,每台机器有\(p\)个输入输出规格。每台机器有一个产量参数,\(p\)个\(0or1or2\)代表输入规格,\(p\)个\(0or1\)代表输出规格。
  • 机器输入规格:0:该部分不能存在,1:该部分必须存在,2:该部分存不存在都行
  • 机器输出规格:0:该部分不存在,1:该部分存在
  • 输出:最大产量,必须存在的机器链
  • 对每条机器链输出链接的两个机器,及其产量。

###思路:
 超级源点向输入规格不存在1的机器连边,流容量为其标准产量。
 输出规格全为1的机器向超级汇点连边,流容量为其标准产量。
 对于输出和输入能相互匹配形成产业链的机器连一条边,流容量为两台机器标准产量的较小值。

 细节见代码。

AC代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#define mme(a,b) memset((a),(b),sizeof((a)))
#define test printf("***\n")
#define fuck(x) cout<<"* "<<x<<"\n"
#define iis std::ios::sync_with_stdio(false)
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int MXN = 1e4+7;
const int MXE = 1e7+7;
struct DINIC{
int tot,vt,vs;
int d[MXN],head[MXN];
struct lp{int u,c;
int v,w,nex;
}cw[MXE];
void add_edge(int a,int b,int c){
cw[++tot].v=b;cw[tot].nex=head[a],cw[tot].w=c;
head[a]=tot;cw[tot].u=a;cw[tot].c=c;
cw[++tot].v=a;cw[tot].nex=head[b],cw[tot].w=0;
head[b]=tot;
}
bool bfs(){
memset(d,-1,sizeof(d));
queue<int>Q;
Q.push(vt);d[vt]=0;
while(!Q.empty()){
int u=Q.front();
Q.pop();
for(int i=head[u];i!=-1;i=cw[i].nex){
int v=cw[i].v;
if(cw[i^1].w&&d[v]==-1){
d[v]=d[u]+1;
Q.push(v);
}
}
}
return d[vs]!=-1;
}
int dfs(int x,int f){
if(x==vt||f==0) return f;
int use=0,w;
for(int i=head[x];i!=-1;i=cw[i].nex){
int to=cw[i].v;
if(d[to]==d[x]-1 && cw[i].w){
w=dfs(to,min(cw[i].w,f-use));
cw[i].w-=w,cw[i^1].w+=w;
use+=w;
if(use==f) return f;
}
}
return use;
}
void init(int st,int ed){
tot=-1;
memset(head,-1,sizeof(head));
vs=st;vt=ed;
}
int max_flow(){
int ans=0;
while(bfs())ans+=dfs(vs,INF);
return ans;
}
void solve(int n){
int ans=max_flow(),cnt=0;
if(ans==0){
printf("0 0\n");
return;
}
vector<int> a,b,c;
for(int i=0;i<=tot;i+=2){
if(cw[i].w!=cw[i].c&&cw[i].u!=vs&&cw[i].v!=vt&&cw[i].u+n!=cw[i].v&&cw[i].u!=cw[i].v){
if(cw[i].u>n)cw[i].u-=n;if(cw[i].v>n)cw[i].v-=n;
a.push_back(cw[i].u);
b.push_back(cw[i].v);
c.push_back(cw[i].c-cw[i].w);
cnt++;
}
}
printf("%d %d\n", ans,cnt);
for(int i=0;i<cnt;++i){
printf("%d %d %d\n", a[i],b[i],c[i]);
}
}
}dinic;
const int N = 805;
int n, m, p;
int vs, vt;
struct lp{
int m,a[N],b[N];
}cw[N];
int main(){
while(~scanf("%d%d",&p,&n)){
vs=0;vt=2*n+1;
dinic.init(vs,vt);
int zero,one;
for(int i=1;i<=n;++i){
scanf("%d",&cw[i].m);
zero=1;one=1;
for(int j=0;j<p;++j){
scanf("%d",&cw[i].a[j]);
if(cw[i].a[j]==1)zero=0;
}
for(int j=0;j<p;++j){
scanf("%d",&cw[i].b[j]);
if(cw[i].b[j]==0)one=0;
}
if(zero)dinic.add_edge(vs,i,cw[i].m);
if(one)dinic.add_edge(i+n,vt,cw[i].m);
dinic.add_edge(i,i+n,cw[i].m);
}
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(i==j)continue;
one=1;
for(int h=0;h<p;++h){
if(cw[i].b[h]+cw[j].a[h]==1)one=0;
}
if(one)dinic.add_edge(i+n,j,min(cw[i].m,cw[j].m));
}
}
dinic.solve(n);
}
return 0;
}

####原题目描述:
![这里写图片描述](https://img-blog.csdn.net/20180804204003745?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTk5MDY3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

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. POJ3436 ACM Computer Factory(最大流)

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

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

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

  5. POJ3436 ACM Computer Factory 【最大流】

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

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

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

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

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

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

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

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

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

  10. POJ-3436:ACM Computer Factory (Dinic最大流)

    题目链接:http://poj.org/problem?id=3436 解题心得: 题目真的是超级复杂,但解出来就是一个网络流,建图稍显复杂.其实提炼出来就是一个工厂n个加工机器,每个机器有一个效率w ...

随机推荐

  1. Java类的成员之四:代码块.

    3.2类的成员之四:代码块 ①初始化块(代码块)作用:对Java对象进行初始化 ②程序的执行顺序: ③一个类中初始化块若有修饰符,则只能被static修饰,称为静态代码块(static block ) ...

  2. vue 和 react 常用包(插件、组件 或 工具)

    vue 和 react  都可以使用的包(只是 纯 js 功能的包) 1.qs : https://blog.csdn.net/sansan_7957/article/details/82227040 ...

  3. iphone5越狱后问题的解决办法

    1,添加各种源失败,显示红字. 解决办法: 如果出现bad 404等红字,一般是由于网络问题,服务器挤爆了,导致不能添加,这种情况大家可以换一个时间段添加源,或者使用网速快一点的网络,比如3g,多试几 ...

  4. CSS:CSS 图像拼合技术

    ylbtech-CSS:CSS 图像拼合技术 1.返回顶部 1. CSS 图像拼合技术 图像拼合 图像拼合就是单个图像的集合. 有许多图像的网页可能需要很长的时间来加载和生成多个服务器的请求. 使用图 ...

  5. Tomcat运行错误示例二

    Tomcat运行错误示例二 当遇到这种错误时,一般是构建路径的问题,按步骤来就好.如图: 点击---->库---->Add Library---->下一步---->选择tomc ...

  6. js 为什么计算结果老是出现NaN

    js 为什么计算结果老是出现NaN 可能原因: 1.操作的两个数,类型不一致 2.有一个值为NaN,计算後为NaN 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函 ...

  7. 通过Bochs分析Lilo启动Linux内核的过程

    1. Bochs调试 参考:http://www.cnblogs.com/long123king/p/3414884.html http://bochs.sourceforge.net/cgi-bin ...

  8. 剑指offer第二版面试题1:数组中重复的数字(JAVA版)

    题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复的次数.请找出数组中任意一个重复的数字.例如如果输入长度为7的数组{ ...

  9. python#父与子的编程之旅#第十四章

    1. 为BankAccount 建立一个类定义.它应该有一些属性,包括账户名(一个字符串).账号(一个字符串或整数)和余额(一个浮点数),另外还要有一些方法显示余额.存钱和取钱. class Bank ...

  10. js面向对象(三)---组件开发

    一.对象的多种表现形式 1.提高对象的复用性 2.如何配置参数和默认参数 不知道该怎么描述,就直接上代码吧,下面做了2个例子,重点看整个组件的大体结构 用组件的方式做拖拽窗口,你可以狠狠的点击这里进行 ...