【题意】

装配一个电脑需要P个零件,现在给出N机器的信息,每个机器可以将k个电脑由状态{S1,S2..,Sp}转变为{Q1,Q2..,Qp},问最多能装配多少台电脑以及对应的方案?

【思路】

1A..拆点,将每个机器状态S到状态Q的容量设为k,其余的设为INF。设置{0,0,0}(或含有2)和源点连接,{1,1,1}(或含有2)和汇点连接。用Dinic跑一次最大流,反向边最后的容量就是方案。

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<queue>
using namespace std;
struct node
{
int to,pos,cap;
};
const int MAXN=;
const int MAXP=;
const int MAXM=;
const int INF=0x7fffffff;
int n,p;
int s[MAXN][MAXP],q[MAXN][MAXP],value[MAXN];
int vis[MAXM];
vector<node> E[MAXM*MAXM];
int dis[MAXM];
int flow; void addedge(int u,int v,int w)
{
/*
POJ必须写成如下形式才能A,否则会CE
node tmp;
tmp.to=v;
tmp.pos=E[v].size();
tmp.cap=w;
E[u].push_back(tmp);
tmp.to=u;
tmp.pos=E[u].size()-1;
tmp.cap=0;
E[v].push_back(tmp);
*/
E[u].push_back((node){v,E[v].size(),w});
E[v].push_back((node){u,E[u].size()-,});
} void init()
{
scanf("%d%d",&p,&n) ;
for (int i=; i<n; i++)
{
scanf("%d",&value[i]);
for (int j=; j<p; j++)
scanf("%d",&s[i][j]);
for (int j=; j<p; j++)
scanf("%d",&q[i][j]);
}
} void buildup()
{
/*拆点*/
for (int i=; i<n; i++)
addedge(i*+,i*+,value[i]); /*如果流入全为0或2,则与源点相连*/
for (int i=; i<n; i++)
{
int flag=;
for (int j=; j<p; j++) if (s[i][j]==)
{
flag=;
break;
}
if (flag) addedge(,i*+,INF);
} /*如果流出全为1或2,则与汇点相连*/
for (int i=; i<n; i++)
{
int flag=;
for (int j=; j<p; j++) if (q[i][j]==)
{
flag=;
break;
}
if (flag) addedge(i*+,n*+,INF);
} /*连边*/
for (int i=; i<n; i++)
for (int j=; j<n; j++)
{
int flag=;
for (int k=; k<p; k++)
if ((q[i][k]== && s[j][k]==) || (q[i][k]== && s[j][k]==))
{
flag=;
break;
}
if (flag) addedge(i*+,j*+,INF);
}
} int bfs()
{
memset(dis,-,sizeof(dis));
queue<int> que;
que.push();
dis[]=; while (!que.empty())
{
int head=que.front();
que.pop();
for (int i=; i<E[head].size(); i++)
{
node tmp=E[head][i];
if (dis[tmp.to]!=- || tmp.cap<=) continue;
dis[tmp.to]=dis[head]+;
que.push(tmp.to);
}
}
if (dis[*n+]==-) return ;
else return ;
}
int dfs(int s,int t,int f)
{
int ret=;
if (s==t) return f;
vis[s]=;//不要忘记这里要设置为访问过
for (int i=;i<E[s].size();i++)
{
node &tmp=E[s][i];
if (vis[tmp.to]== && tmp.cap>)
{
int delta=dfs(tmp.to,t,min(tmp.cap,f));
if (delta>)
{
ret+=delta;
tmp.cap-=delta;
E[tmp.to][tmp.pos].cap+=delta;
f-=delta;
}
}
}
return ret;
} void Dinic()
{
flow=;
while (bfs())
{
for (;;)
{
memset(vis,,sizeof(vis));
int f=dfs(,*n+,INF);
if (f==) break;
else flow+=f;
}
}
} void output()
{
cout<<flow<<' ';
int M=,l[MAXN],r[MAXN],c[MAXN];
for (int i=; i<*n+; i++)
for (int j=; j<E[i].size(); j++)
{
node tmp=E[i][j];
if (E[tmp.to][tmp.pos].cap> && E[tmp.to][tmp.pos].cap<=flow && tmp.to!=*n+ && ((tmp.to+)>>!=(i+)>>))
{
M++;
l[M]=(i+)>>;
r[M]=(tmp.to+)>>;
c[M]=E[tmp.to][tmp.pos].cap;
}
}
cout<<M<<endl;
for (int i=; i<=M; i++) cout<<l[i]<<' '<<r[i]<<' '<<c[i]<<endl;
} int main()
{
init();
buildup();
Dinic();
output();
return ;
}

【最大流】POJ3236-ACM Computer Factory的更多相关文章

  1. POJ3436 ACM Computer Factory 【最大流】

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

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

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

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

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

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

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

  5. POJ3436:ACM Computer Factory(最大流)

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

  6. ACM Computer Factory - poj 3436 (最大流)

      Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5949   Accepted: 2053   Special Judge ...

  7. POJ3436 ACM Computer Factory —— 最大流

    题目链接:https://vjudge.net/problem/POJ-3436 ACM Computer Factory Time Limit: 1000MS   Memory Limit: 655 ...

  8. poj-3436.ACM Computer Factory(最大流 + 多源多汇 + 结点容量 + 路径打印 + 流量统计)

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

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

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

  10. POJ 3464 ACM Computer Factory

    ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4829 Accepted: 1641 ...

随机推荐

  1. SQL SERVER 常用公式

    SQL SERVER 获取当前月的天数 SELECT -DAY(getdate()+-DAY(getdate())) SQL server 除法计算百分比[整数乘1.0否则结果为0或1] CONVER ...

  2. js_在原有的日期上添加天数输出添加后的日期

    开始编码工作也有段时间了,想想没有留下点什么,有点遗憾.学到的一些经验,写写,分享一下.也给自己整理一下. 今天分享一下,在原有的日期上添加天数输出添加后的日期.开始做的时候,简单的思路是,直接用ne ...

  3. Angular2.0 基础: 环境搭建

    最近在学习Angular2的使用,其实看过Angular2 文档的都知道,相比于之前的Angular1,Angular2 的改动还是挺大的. 而对于‘angular2 的本地开发环境的搭建的中,我们首 ...

  4. python进行机器学习(五)之模型打分

    一.画出模型的残差值分布情况 #!/usr/bin/python import pandas as pd import numpy as np import csv as csv import mat ...

  5. Fiddler抓取HTTPS协议

    HTTPS协议握手过程: 1,客户端明文请求,把自己支持的非对称加密算法(用于使用CA证书公钥加密计算生成协商密钥的随机数per_master).对称加密算法(用于以后使用协商密钥加密传输内容).验证 ...

  6. AlertDialog.Builder 显示为白色 蓝色字

    AlertDialog.Builder dialog = new AlertDialog.Builder( getActivity(),AlertDialog.THEME_HOLO_LIGHT);

  7. imx6设备树pinctrl解析【转】

    转自:http://blog.csdn.net/michaelcao1980/article/details/50730421 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在移植linu ...

  8. python近期遇到的一些面试问题(二)

    1. 解释什么是栈溢出,在什么情况下可能出现. 栈溢出是由于C语言系列没有内置检查机制来确保复制到缓冲区的数据不得大于缓冲区的大小,因此当这个数据足够大的时候,将会溢出缓冲区的范围.在Python中, ...

  9. HDU 6119 小小粉丝度度熊 双指针

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6119 题意:中文题面. 解法:先处理可能交叉的区间,然后容易发现满足双指针的特性. //HDU 611 ...

  10. conso.log占位符

    %d占位符表示number %s占位符表示string %f占位符表示浮点数 %o占位符表示对象