【最大流】POJ3236-ACM Computer Factory
【题意】
装配一个电脑需要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的更多相关文章
- POJ3436 ACM Computer Factory 【最大流】
ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5412 Accepted: 1 ...
- POJ 3436 ACM Computer Factory (网络流,最大流)
POJ 3436 ACM Computer Factory (网络流,最大流) Description As you know, all the computers used for ACM cont ...
- poj3436 ACM Computer Factory, 最大流,输出路径
POJ 3436 ACM Computer Factory 电脑公司生产电脑有N个机器.每一个机器单位时间产量为Qi. 电脑由P个部件组成,每一个机器工作时仅仅能把有某些部件的半成品电脑(或什么都没有 ...
- POJ3436 ACM Computer Factory(最大流/Dinic)题解
ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8944 Accepted: 3 ...
- POJ3436:ACM Computer Factory(最大流)
ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9963 Accepted: 3 ...
- ACM Computer Factory - poj 3436 (最大流)
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5949 Accepted: 2053 Special Judge ...
- POJ3436 ACM Computer Factory —— 最大流
题目链接:https://vjudge.net/problem/POJ-3436 ACM Computer Factory Time Limit: 1000MS Memory Limit: 655 ...
- poj-3436.ACM Computer Factory(最大流 + 多源多汇 + 结点容量 + 路径打印 + 流量统计)
ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10940 Accepted: ...
- Poj 3436 ACM Computer Factory (最大流)
题目链接: Poj 3436 ACM Computer Factory 题目描述: n个工厂,每个工厂能把电脑s态转化为d态,每个电脑有p个部件,问整个工厂系统在每个小时内最多能加工多少台电脑? 解题 ...
- POJ 3464 ACM Computer Factory
ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4829 Accepted: 1641 ...
随机推荐
- LeetCode 19 Valid Parentheses
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...
- 内存分配器memblock【转】
转自:http://blog.csdn.net/kickxxx/article/details/54710243 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 背景 Data ...
- 获取并编译最新的Notepad++源码
获取并编译最新的Notepad++源码 http://blog.csdn.net/u012814856/article/details/68947310 Notepad++源码编译及其分析 http: ...
- twemproxy 简介、安装配置
twemproxy 简介.安装配置 http://www.xuchanggang.cn/archives/993.html
- c++ ui 库
Dulib 比较流行的direct ui 界面框架 UIStone 据说金山词霸用着,查询资料甚少 DirectUI qq使用了据说,多学习学习吧 基于directUI的dulib不错 c盘没空间,运 ...
- NOIP 2012 Day1
tags: NOIP 模拟 倍增 高精 Python categories: 信息学竞赛 总结 Luogu P1079 Vigenère 密码 Solution 表示并不是很懂其他人发的题解. 我是这 ...
- 前后端分离,Vue+restfullframework
一.准备 修改源: npm config set registry https://registry.npm.taobao.org 创建脚手架: vue init webpack Vue项目名称 #I ...
- 安卓屏幕旋转时,禁止Activity重新加载
安卓设备旋转屏幕时,Activity默认会重新加载,如果是要读取大量数据的场景,那等待的时间比较长,这一点不可接受,所以要想办法禁止Activity自动重新加载. 方法如下在AndroidManife ...
- 如何在SQL Server中的SELECT TOP 中使用变量
语法 [ TOP (expression) [PERCENT] [ WITH TIES ] ] 注意:expression 是在一对圆括号内的,而之后又有如下的例子 在 TOP 中使用变量 以下示 ...
- JavaScript将最终获得正确的异步编程
JavaScript将最终获得正确的异步编程 包括该提案异步 在ECMAScript中的功能已经达到第四阶段; 这意味着它将在2017年发布的标准.但是这对JavaScript开发者意味着什么? 有很 ...