【题意】

装配一个电脑需要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. bzoj 1084 DP

    首先对于m==1的情况非常容易处理(其实这儿因为边界我错了好久...),直接DP就好了,设f[i][k]为这个矩阵前i个选k个矩阵的最大和,那么f[i][k]=max(f[j][k-1]+sum[j+ ...

  2. 将资源文件夹中的文件通过流的方式写入到应用的File文件夹中

    //1.在Files文件夹中创建同名的数据库文件 File files = getFilesDir(); File file = new File(files, DBName); if(file.ex ...

  3. url编码模块

    use LWP::SImple; use URI::Escape; encoded_string = uri_escape(raw_string); get(encoded_string);

  4. Python标准库笔记(4) — collections模块

    这个模块提供几个非常有用的Python容器类型 1.容器 名称 功能描述 OrderedDict 保持了key插入顺序的dict namedtuple 生成可以使用名字来访问元素内容的tuple子类 ...

  5. vue路由-编程式导航

    除了使用 <router-link> 创建 a 标签来定义导航链接,我们还可以借助 router 的实例方法,通过编写代码来实现. router.push(location, onComp ...

  6. Python Matplotlib图表汉字显示成框框的解决办法

    http://blog.sina.com.cn/s/blog_662dcb820102vu3d.html http://blog.csdn.net/fyuanfena/article/details/ ...

  7. HDU 4305 Lightning Matrix Tree定理

    题目链接:https://vjudge.net/problem/HDU-4305 解法:首先是根据两点的距离不大于R,而且中间没有点建立一个图.之后就是求生成树计数了. Matrix-Tree定理(K ...

  8. lsb_release查看当前系统的发行版信息

    Linux除了用uname -r查看系统版本信息外,还可以用lsb_release. 安装: yum install -y redhat-lsb-core 使用: lsb_release -a

  9. Codeforces 873B - Balanced Substring(思维)

    题目链接:http://codeforces.com/problemset/problem/873/B 题目大意:一个字符串全部由‘0’和‘1’组成,当一段区间[l,r]内的‘0’和‘1’个数相等,则 ...

  10. ZOJ-2753

    Min Cut (Destroy Trade Net) Time Limit: 15 Seconds      Memory Limit: 32768 KB Given an undirected g ...