【题意】

装配一个电脑需要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. mave的依赖范围

    compile(编译范围) compile是默认的范围:如果没有提供一个范围,那该依赖的范围就是编译范 围.编译范围依赖在所有的classpath中可用,同时它们也会被打包. provided(已提供 ...

  2. Python脚本 - 常用单位转换

    测试系统为:Centos 6.7 Python版本为: 3.6.4 脚本功能:常用单位的转换,这里用内存来模拟 import pstuil def bytes2human(n): symbols = ...

  3. Python学习笔记 - day10 - 正则表达式

    正则表达式 字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样 ...

  4. 安全测试===sqlmap(肆)转载

    十八.杂项 1.使用简写 参数:-z 有些参数组合是被经常用到的,如“--batch --random-agent --ignore-proxy --technique=BEU”,这样写一大串很不好看 ...

  5. monkey测试===monkeyrunner测试教程(1)

    1.安装测试环境 jdk 安装与配置 android sdk安装与配置 Python编辑器安装与配置 以上安装请自行百度教程 Monkeyrunner使用方法 http://www.android-d ...

  6. 微信小程序使用canvas绘制图片的注意事项

    1.单位换算问题,canvas的尺寸单位是px,所以单位需要做个换算,可以通过wx.getSystemInfo获取屏幕宽高(单位是px),微信小程序无论什么机型,屏幕宽度都是750rpx,因此可以做个 ...

  7. [ Python ] set集合及函数的使用

    1. set类型 set 和 dict 类似,也是一组 key 的集合,但是不存储 value. 由于 key  不重复,所以,在 set 中, 没有重复的 key 集合是可变类型 (1)集合的创建 ...

  8. redis之(十八)redis的支持水平扩容的集群特性,以及插槽的相关操作

    [一]主从集群的缺点,客户端分片的缺点 (1)主从+哨兵的redis集群,只是做主从备份,数据冗余的一种处理.但在存储空间的扩展上还是有限制.因为集群中的节点都是存储同样的数据.单一节点的容量,就可以 ...

  9. SGU 263. Towers

    各种操作: put x c:表示在第 x 列上增加 c 个积木(c>0). tput t x c:表示在塔 t 的第 x 列上增加 c 个积木(c>0). towers:询问共有几座塔. ...

  10. EF Groupby

    最近做了个检索类的项目,其中就用到统计了,就是按照热门搜索排序来的. 话不多说,直接代码 var requirementSearchesOrder = app_RequirementSearches. ...