题意:给你p和n,p代表每台计算器需要几个部分组成,n代表有几个组装机器,接下来n行,每行第一个数代表这台机器能够每小时组装几台,剩下前三个数字表示使用这台机器需要的前置条件(0代表当前组装不能有这个部分,1代表得有,2代表无所谓),剩下三个数字表示使用这台机器后的组装有那几个部分,问你最多能组装多少台

解题思路:首先最大流,建立一个超级源点,这个源点和所有前三个数字没有1的机器相连,建立一个超级汇点与所有后三个数字全为1的机器相连,中间所有的机器拆成两个点,边权为这个机器每小时的组装量,拆点的意义就是因为流过这个点的流量有限制

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=5050;
struct sc
{
int x,y,w;
}fna[maxn];
struct node
{
int val;
int x[15];
int y[15];
}a[100];
struct Edge
{
int fa;
int next;
int to;
int v;
int w;
}edge[maxn];
int head[maxn],cnt;
int pre[maxn],visit[maxn];
int n,p,cot;
int Start,End;
void add(int u,int v,int w)
{
edge[cnt].next=head[u];edge[cnt].to=v;edge[cnt].fa=u;edge[cnt].w=w;head[u]=cnt++;
edge[cnt].next=head[v];edge[cnt].to=u;edge[cnt].fa=v;edge[cnt].w=0;head[v]=cnt++;
}
int bfs(int s,int e)
{
queue<int>q;
memset(visit,0,sizeof(visit));memset(pre,-1,sizeof(pre));
q.push(s);visit[s]=1;
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
if(edge[i].w<=0||visit[v])
continue;
pre[v]=i;visit[v]=1;
if(v==e)
return 1;
q.push(v);
}
}
return 0;
}
int EK()
{
int ans=0;
int sub;
while(bfs(Start,End))
{
sub=inf;
int k=pre[End];
while(k!=-1)
{
sub=min(sub,edge[k].w);
k=pre[edge[k].fa];
}
k=pre[End];
while(k!=-1)
{
edge[k].w-=sub;
edge[k^1].w+=sub;
k=pre[edge[k].fa];
}
ans+=sub;
}
return ans;
}
int main()
{
int vis[150][150];
int flag;
memset(head,-1,sizeof(head));cnt=0;
memset(vis,0,sizeof(vis));
scanf("%d%d",&p,&n);
Start=0;End=2*n+1;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].val);
for(int j=1;j<=p;j++)
scanf("%d",&a[i].x[j]);
for(int j=1;j<=p;j++)
scanf("%d",&a[i].y[j]);
}
for(int i=1;i<=n;i++)
{
add(i,i+n,a[i].val);
flag=0;
for(int j=1;j<=p;j++)
if(a[i].x[j]==1)
flag=1;
if(flag==0)
add(Start,i,a[i].val);
flag=0;
for(int j=1;j<=p;j++)
if(a[i].y[j]!=1)
flag=1;
if(flag==0)
add(i+n,End,a[i].val);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
flag=0;
if(i==j)
continue;
for(int k=1;k<=p;k++)
{
if(a[j].x[k]==2)
continue;
if(a[j].x[k]!=a[i].y[k])
flag=1;
}
if(flag==0)
{
add(i+n,j,a[i].val);
vis[i+n][j]=1;
}
}
int ans=EK();
printf("%d ",ans);
for(int i=1;i<=n;i++)
for(int j=head[i+n];j!=-1;j=edge[j].next)
{
if(vis[i+n][edge[j].to]&&edge[j].w<a[i].val)
cot++;
}
printf("%d\n",cot);
for(int i=1;i<=n;i++)
for(int j=head[i+n];j!=-1;j=edge[j].next)
{
if(vis[i+n][edge[j].to]&&edge[j].w<a[i].val)
printf("%d %d %d\n",i,edge[j].to,a[i].val-edge[j].w);
}
}

  

poj3436(拆点最大流)的更多相关文章

  1. hdu4289 最小割最大流 (拆点最大流)

    最小割最大流定理:(参考刘汝佳p369)增广路算法结束时,令已标号结点(a[u]>0的结点)集合为S,其他结点集合为T=V-S,则(S,T)是图的s-t最小割. Problem Descript ...

  2. Control(拆点+最大流)

    Control http://acm.hdu.edu.cn/showproblem.php?pid=4289 Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  3. BZOJ 1877 晨跑 拆点费用流

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1877 题目大意: Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧 ...

  4. Risk UVA - 12264 拆点法+最大流+二分 最少流量的节点流量尽量多。

    /** 题目:Risk UVA - 12264 链接:https://vjudge.net/problem/UVA-12264 题意:给n个点的无权无向图(n<=100),每个点有一个非负数ai ...

  5. poj3436网络流之最大流拆点

    这题看了半天看不懂题意...还是看的网上题意写的 加一个源点一个汇点,把每个点拆成两个,这两个点的流量是v,其他联通的边都设为无穷大 输入没有1的点就与源点连接,输出只有1的点就与汇点连接 还有这个输 ...

  6. HDU 3572 Task Schedule(拆点+最大流dinic)

    Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  7. POJ 2391 Ombrophobic Bovines ★(Floyd+二分+拆点+最大流)

    [题意]有n块草地,一些奶牛在草地上吃草,草地间有m条路,一些草地上有避雨点,每个避雨点能容纳的奶牛是有限的,给出通过每条路的时间,问最少需要多少时间能让所有奶牛进入一个避雨点. 和POJ2112很类 ...

  8. CF 277E Binary Tree on Plane (拆点 + 费用流) (KM也可做)

    题目大意: 平面上有n个点,两两不同.现在给出二叉树的定义,要求树边一定是从上指向下,即从y坐标大的点指向小的点,并且每个结点至多有两个儿子.现在让你求给出的这些点是否能构成一棵二叉树,如果能,使二叉 ...

  9. 【拆点费用流】【HDU1853】【 Cyclic Tour】

    题意: 有N个城市,M条单向路,Tom想环游全部城市,每次至少环游2个城市,每个城市只能被环游一次.由于每条单向路都有长度,要求游遍全部城市的最小长度. // 给定一个有向图,必须用若干个环来覆盖整个 ...

随机推荐

  1. Linux常见命令(一)

    三.常见linux命令: 命令提示符的解释: (1).组成(默认):[root@localhost~]# (2)[root@localhost~] root:系统当前登录账户名称,超级管理员为root ...

  2. splay详解(三)

    前言 上一节我们学习了splay所能解决的基本问题,这节我来讲一下splay怎么搞区间问题 实现 splay搞区间问题非常简单,比如我们要在区间$l,r$上搞事情,那么我们首先把$l$的前驱旋转到根节 ...

  3. 无依赖简单易用的Dynamics 365实体记录数计数器并能计算出FetchXml返回的记录数

    本人微信公众号:微软动态CRM专家罗勇 ,回复278或者20180812可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 我们 ...

  4. 通过fromdata实现上传文件

    其实呢,文件上传的插件很多,可是现在做的东西要求尽量少用插件,所以就自己写了一下. 之前也用node写过对文件处理方面的东西,这次用php写着试一下. a.html文件 <!DOCTYPE ht ...

  5. 三、View的事件体系

    1.View基础知识 1.1.什么是View View是Android中所有控件的基类.View是一种界面层的控件的一种抽象,代表了一个控件.除了View,还有ViewGroup,内部包含了许多个控件 ...

  6. 【公众号系列】超详细SAP HANA JOB全解析

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[公众号系列]超详细SAP HANA JOB全解 ...

  7. python开发规范和(configparser、random模块)

    目录结构: bin:存放程序入口,程序启动文件. conf:存放配置文件,配置文件主要是一些全局变量,路径信息等. core:程序核心文件,不涉及到业务逻辑. app:存放和系统业务相关的逻辑. db ...

  8. 【笔记】嵩天.Python语言程序设计.完成两个简单实例(温度转换和绘图)

    [博客导航] [Python相关] 目标 使用PyCharm,完成两个小实例的编写和运行.一个是温度转换,一个是蟒蛇图形绘制. 过程 1.先设置project目录,虽然命名不是很正式,主要不太习惯软件 ...

  9. raise

    raise 后边一般是更报错处理的,比如nameerror.先上代码 try: a='a0'+8 except: print('l') raise else: print('women') print ...

  10. GIL:全局解释器锁 VS 用户程序锁

    既然有了GIL锁,CPython还要多线程干什么? ''' GIL:全局解释器锁的来历 四核:同一时刻真正有四个任务在运行,多核的意义在于此 单核:看上去是并发的,因为进行了上下文切换,单核永远是串行 ...