【题意】

装配一个电脑需要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. C# 文件类的操作---删除

    //删除文件夹 1这是最简单的方法 DirectoryInfo di = new DirectoryInfo(string Path); di.Delete(true); 注:path是你要删除的非空 ...

  2. CPU架构及并发编程基础(一)

    一.intel cpu发展计划tick-tock Tick-Tock是Intel发展微处理器芯片设计制造业务的一种战略模式.Intel指出,每一次处理器微架构的更新和每一次芯片制程的更新遵循“Tick ...

  3. Coursera在线学习---第十节.大规模机器学习(Large Scale Machine Learning)

    一.如何学习大规模数据集? 在训练样本集很大的情况下,我们可以先取一小部分样本学习模型,比如m=1000,然后画出对应的学习曲线.如果根据学习曲线发现模型属于高偏差,则应在现有样本上继续调整模型,具体 ...

  4. 自动化测试===unittest配套的HTMLTestRunner.py生成html报告源码

    更改版: 全部复制,命名为  HTMLTestRunner.py 文件 #使用方法参见之前的文档:自动化测试===unittest和requests接口测试案例,测试快递查询api(二) " ...

  5. Win10默认图片查看器更改

    Win10自带的图片查看器不是很习惯,其背景乌漆嘛黑,宽扁的额头让人想起了黑边火腿肠手机,无法直视.怀念Win7和Win8.1的图片查看器,一个鼠标滚轮缩放自如的酸爽感觉.但却遗憾地发现,并不能直观地 ...

  6. mui页面跳转

    $('.mui-title').on('click',function(){ mui.openWindow({ //跳转到指导信息页面 url:"/index.php?m=mobile&am ...

  7. django使用haystack对接Elasticsearch实现商品搜索

    # 原创,转载请留言联系 前言: 在做一个商城项目的时候,需要实现商品搜索功能. 说到搜索,第一时间想到的是数据库的 select * from tb_sku where name like %苹果手 ...

  8. sublime view_in_browser

    今天安装了sublime的插件view in browser,发现ctrl+alt+V用不了,在preferences看了view in browser的配置,发现browser不是我电脑上的默认浏览 ...

  9. Mac下 Docker部署SpringBoot应用

    一.安装Docker环境 使用 Homebrew 安装 macOS 我们可以使用 Homebrew 来安装 Docker. Homebrew 的 Cask 已经支持 Docker for Mac,因此 ...

  10. 《java并发编程实战》读书笔记2--对象的共享,可见性,安全发布,线程封闭,不变性

    这章的主要内容是:如何共享和发布对象,从而使它们能够安全地由多个线程同时访问. 内存的可见性 确保当一个线程修改了对象状态后,其他线程能够看到发生的状态变化. 上面的程序中NoVisibility可能 ...