题意:每台电脑共有p种零件,现在有n台机器,给出n台机器每台需要的一些种类零件当原料(0代表不需要,1代表必须要,2代表可有可无)和输出的产品零件。问怎么安排生产线使生产出来零件可以组装的电脑最多。

思路:如果机器的原材料什么都不需要的话就可以当源点,如果机器输出的零件种类为p就可以当汇点。刚开始想复杂了(1 0 1 可以同时跟1 0 0和0 0 1相连),这题只有当一台机器的输出格式跟另一台的输入格式一样时才可以相连,不能有多余的零件产生。最后想想如果不是这样的话,2代表的可有可无就没意义了。当p=3时,输出1 0 1不能跟1 0 0相连但可以跟1 0 2相连。

#include<stdio.h>
#include<string.h>
const int N=100;
const int inf=0x3fffffff;
int gap[N],dis[N],head[N],num,start,end,ans,pp[N*N];
struct edge
{
int st,ed,flow,next;
}e[N*N],ee[N*N];
void addedge(int x,int y,int w)
{
ee[num].st=x;ee[num].ed=y;ee[num].flow=w;
e[num].st=x;e[num].ed=y;e[num].flow=w;e[num].next=head[x];head[x]=num++;
e[num].st=y;e[num].ed=x;e[num].flow=0;e[num].next=head[y];head[y]=num++;
}
struct node
{
int in[11],out[11],w;
}p[N];
int dfs(int u,int minflow)
{
if(u==end)return minflow;
int i,flow=0,f,v,min_dis=ans-1;
for(i=head[u];i!=-1;i=e[i].next)
{
if(e[i].flow<=0)continue;
v=e[i].ed;
if(dis[v]+1==dis[u])
{
f=dfs(v,e[i].flow>minflow-flow?minflow-flow:e[i].flow);
e[i].flow-=f;
e[i^1].flow+=f;
flow+=f;
if(flow==minflow)break;
if(dis[start]>=ans)return flow;
}
min_dis=min_dis>dis[v]?dis[v]:min_dis;
}
if(flow==0)
{
if(--gap[dis[u]]==0)
dis[start]=ans;
dis[u]=min_dis+1;
gap[dis[u]]++;
}
return flow;
}
int isap()
{
int maxflow=0;
memset(dis,0,sizeof(dis));
memset(gap,0,sizeof(gap));
gap[0]=ans;
while(dis[start]<ans)
maxflow+=dfs(start,inf);
return maxflow;
}
int main()
{
int i,n,m,j,flag,k,sum,maxflow;
while(scanf("%d%d",&m,&n)!=-1)
{
memset(head,-1,sizeof(head));
start=0,end=n+1;ans=end+1;num=0;
for(i=1;i<=n;i++)
{
flag=0;
scanf("%d",&p[i].w);
for(j=0;j<m;j++)
{
scanf("%d",&p[i].in[j]);
if(p[i].in[j]==1)
flag=1;
}
if(flag==0)//如果什么原料都不要就与超级源点相连
addedge(start,i,p[i].w);
flag=0;
for(j=0;j<m;j++)
{
scanf("%d",&p[i].out[j]);
if(p[i].out[j]==0)
flag=1;
}
if(flag==0)//如果能生产所有的零件跟汇点相连
addedge(i,end,p[i].w);
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(j==i)continue;
for(k=0;k<m;k++)
{
if(p[j].in[k]==2)continue;//可有可无的时候,不管p[i].out[k]为何值都可以
if(p[i].out[k]==p[j].in[k])continue;//i的输出要跟j的输入一样
break;
}
if(k==m)
addedge(i,j,p[i].w);
}
}
maxflow=isap();
sum=0;
for(i=0;i<num;i+=2)
{
if(e[i].st==start||e[i].ed==end)continue;
if(e[i].flow<ee[i].flow)//如果边的流量变小的,就有流量走过
pp[sum++]=i;
}
printf("%d %d\n",maxflow,sum);
for(j=0;j<sum;j++)
{
i=pp[j];
printf("%d %d %d\n",e[i].st,e[i].ed,ee[i].flow-e[i].flow);
}
}
return 0;
}

poj 3436 (最大流)的更多相关文章

  1. [poj 3436]最大流+输出结果每条边流量

    题目链接:http://poj.org/problem?id=3436 大力套kuangbin板过了orz #include<cstdio> #include<cstring> ...

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

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

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

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

  4. poj 3281 最大流+建图

    很巧妙的思想 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/21/2649850.html 本题能够想到用最大流做,那真的是太绝了.建模的方法很 ...

  5. POJ - 3436 ACM Computer Factory 网络流

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

  6. A - ACM Computer Factory POJ - 3436 网络流

    A - ACM Computer Factory POJ - 3436 As you know, all the computers used for ACM contests must be ide ...

  7. POJ 3436:ACM Computer Factory(最大流记录路径)

    http://poj.org/problem?id=3436 题意:题意很难懂.给出P N.接下来N行代表N个机器,每一行有2*P+1个数字 第一个数代表容量,第2~P+1个数代表输入,第P+2到2* ...

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

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

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

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

随机推荐

  1. qt模型学习

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' from PyQt4.Qt import * from PyQt4. ...

  2. 【Android】实现动态显示隐藏密码输入框的内容

    在设置输入密码框时,有些时候需要按钮控制输入的是“明文”或者“暗文”. 这里提供一种Android实现动态显示隐藏密码输入框的内容的方法: 主要是通过设置EditText的setTransformat ...

  3. HTTP协议3之压缩--转

    HTTP内容编码和HTTP压缩的区别 HTTP压缩,在HTTP协议中,其实是内容编码的一种. 在http协议中,可以对内容(也就是body部分)进行编码, 可以采用gzip这样的编码. 从而达到压缩的 ...

  4. Android ---------- 清单文件中Activity常规设置

    <activity android:name="xxxxx" android:alwaysRetainTaskState="true" android:c ...

  5. for()循环

    今天发现自己一直以来都搞错了for()循环的执行顺序.这么简单的问题一直都错了,我也是醉了. ;i>&&a[i]>a[i-];--i) { } //即 for(init_s ...

  6. 读jquery.cookie.js源码学到的几个技巧

    一.兼容AMD.CommonJS和普通JS的写法 (function (factory) { if (typeof define === 'function' && define.am ...

  7. mac下 WebStorm下主题包安装

    mac下: 主题包 1.mac下,点击桌面,使用shift+command+G 输入:~/Library/Preferences 前往(mac查找安装目录的方法,因为默认这些文件夹是隐藏的),进入We ...

  8. centos源码安装git

    因为Centos上yum安装的话可能版本比较低,使用中会有一些难以预料的问题出现. 从源代码编译安装方法: #Centos执行: yum install curl-devel expat-devel ...

  9. Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容

    1,引言 在Python网络爬虫内容提取器一文我们详细讲解了核心部件:可插拔的内容提取器类gsExtractor.本文记录了确定gsExtractor的技术路线过程中所做的编程实验.这是第二部分,第一 ...

  10. Hibernate配置属性

    Hibernate配置属性 属性名 用途 hibernate.dialect 一个Hibernate Dialect类名允许Hibernate针对特定的关系数据库生成优化的SQL. 取值 full.c ...