POJ - 3436 ACM Computer Factory 网络流
POJ-3436:http://poj.org/problem?id=3436
题意
组配计算机,每个机器的能力为x,只能处理一定条件的计算机,能输出特定的计算机配置。进去的要求有1,进来的计算机这个位子就要求为1,进去的要求有0,进来的计算机这个位子就要求为0.
思路
因为点上有容量限制,所以把每个点拆掉,连一条容量为这个机器的能力的边。源点向要求为0的机器连容量inf的边,把能完全组装好计算机的机器连向汇点。中间把符合条件的机器间连边,容量为inf;
- #include <algorithm>
- #include <iterator>
- #include <iostream>
- #include <cstring>
- #include <iomanip>
- #include <cstdlib>
- #include <cstdio>
- #include <string>
- #include <vector>
- #include <bitset>
- #include <cctype>
- #include <queue>
- #include <cmath>
- #include <list>
- #include <map>
- #include <set>
- using namespace std;
- //#pragma GCC optimize(3)
- //#pragma comment(linker, "/STACK:102400000,102400000") //c++
- #define lson (l , mid , rt << 1)
- #define rson (mid + 1 , r , rt << 1 | 1)
- #define debug(x) cerr << #x << " = " << x << "\n";
- #define pb push_back
- #define pq priority_queue
- typedef long long ll;
- typedef unsigned long long ull;
- typedef pair<ll ,ll > pll;
- typedef pair<int ,int > pii;
- typedef pair<int ,pii> p3;
- //priority_queue<int> q;//这是一个大根堆q
- //priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
- #define fi first
- #define se second
- //#define endl '\n'
- #define OKC ios::sync_with_stdio(false);cin.tie(0)
- #define FT(A,B,C) for(int A=B;A <= C;++A) //用来压行
- #define REP(i , j , k) for(int i = j ; i < k ; ++i)
- //priority_queue<int ,vector<int>, greater<int> >que;
- const ll mos = 0x7FFFFFFFLL; //
- const ll nmos = 0x80000000LL; //-2147483648
- const int inf = 0x3f3f3f3f;
- const ll inff = 0x3f3f3f3f3f3f3f3fLL; //
- const double PI=acos(-1.0);
- template<typename T>
- inline T read(T&x){
- x=;int f=;char ch=getchar();
- while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
- while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
- return x=f?-x:x;
- }
- // #define _DEBUG; //*//
- #ifdef _DEBUG
- freopen("input", "r", stdin);
- // freopen("output.txt", "w", stdout);
- #endif
- /*-----------------------show time----------------------*/
- const int maxn = ;
- int p,n;
- struct node{
- int d;
- int in[maxn],out[maxn];
- }a[maxn];
- struct edge
- {
- int u,v,cap;
- edge(){}
- edge(int u,int v,int cap):
- u(u),v(v),cap(cap){}
- }es[];
- int tot,s,t;
- vector<int>tab[];
- int dis[],cur[];
- void addedge(int u,int v,int cap){
- tab[u].pb(tot);
- es[tot++] = edge(u,v,cap);
- tab[v].pb(tot);
- es[tot++] = edge(v,u,);
- }
- bool bfs(){
- queue<int>q;q.push(s);
- memset(dis,inf,sizeof(dis));
- dis[s] = ;
- while(!q.empty()){
- int h = q.front();q.pop();
- for(int i=; i<tab[h].size(); i++){
- edge &e = es[tab[h][i]];
- if(e.cap > && dis[e.v] >= inf){
- dis[e.v] = dis[h] + ;
- q.push(e.v);
- }
- }
- }
- return dis[t] < inf;
- }
- int dfs(int x,int maxflow){
- if(x==t)return maxflow;
- for(int i=cur[x] ; i<tab[x].size(); i++){
- cur[x] = i;
- edge &e = es[tab[x][i]];
- if(dis[e.v] == dis[x] + && e.cap > ){
- int flow = dfs(e.v, min(maxflow, e.cap));
- if(flow){
- e.cap -= flow;
- es[tab[x][i] ^ ].cap += flow;
- return flow;
- }
- }
- }
- return ;
- }
- int dinic(){
- int ans = ;
- while(bfs()){
- int flow;
- memset(cur,,sizeof(cur));
- do{
- flow = dfs(s,inf);
- if(flow)ans += flow;
- }while(flow);
- }
- return ans;
- }
- int main(){
- scanf("%d%d", &p, &n);
- for(int i=; i<=n; i++){
- scanf("%d", &a[i].d);
- addedge(i,i+n,a[i].d);
- int t1 = ,t2 = ;
- for(int j=; j<=p; j++)scanf("%d",&a[i].in[j]), t1 += a[i].in[j]== ? :;
- for(int j=; j<=p; j++)scanf("%d",&a[i].out[j]),t2 += a[i].out[j]>? : ;
- if(t1 == ) addedge(, i, inf);
- if(t2 == p) addedge(i+n,n+n+,inf);
- }
- for(int i=; i<=n; i++){
- for(int j=; j<=n; j++){
- if(i == j)continue;
- int flag = ;
- for(int t = ; t <= p; t++){
- if(a[j].in[t] == && a[i].out[t] == )
- flag = ;
- if(a[j].in[t] == && a[i].out[t] == )
- flag = ;
- }
- if(flag)addedge(i+n,j,inf);
- }
- }
- s = ,t = n+n+;
- printf("%d ", dinic());
- int rere = ;
- vector<p3>v;
- for(int i=; i<=n; i++){
- for(int j = ; j < tab[i+n].size(); j++){
- edge e = es[tab[i+n][j]];
- if(e.cap < inf && i!= e.v&&e.v != t){
- //printf("%d %d %d\n",i,e.v,inf - e.cap);
- v.pb(p3(i,pii(e.v,inf - e.cap)));
- rere ++;
- }
- }
- }
- printf("%d\n", rere);
- for(int i=; i<rere; i++){
- printf("%d %d %d\n", v[i].fi,v[i].se.fi,v[i].se.se);
- }
- return ;
- }
POJ 3436
POJ - 3436 ACM Computer Factory 网络流的更多相关文章
- POJ 3436 ACM Computer Factory (网络流,最大流)
POJ 3436 ACM Computer Factory (网络流,最大流) Description As you know, all the computers used for ACM cont ...
- Poj 3436 ACM Computer Factory (最大流)
题目链接: Poj 3436 ACM Computer Factory 题目描述: n个工厂,每个工厂能把电脑s态转化为d态,每个电脑有p个部件,问整个工厂系统在每个小时内最多能加工多少台电脑? 解题 ...
- kuangbin专题专题十一 网络流 POJ 3436 ACM Computer Factory
题目链接:https://vjudge.net/problem/POJ-3436 Sample input 1 3 4 15 0 0 0 0 1 0 10 0 0 0 0 1 1 30 0 1 2 1 ...
- POJ 3436 ACM Computer Factory 最大流,拆点 难度:1
题目 http://poj.org/problem?id=3436 题意 有一条生产线,生产的产品共有p个(p<=10)零件,生产线上共有n台(n<=50)机器,每台机器可以每小时加工Qi ...
- POJ - 3436 ACM Computer Factory(最大流)
https://vjudge.net/problem/POJ-3436 题目描述: 正如你所知道的,ACM 竞赛中所有竞赛队伍使用的计算机必须是相同的,以保证参赛者在公平的环境下竞争.这就是所有这些 ...
- POJ 3436 ACM Computer Factory(最大流+路径输出)
http://poj.org/problem?id=3436 题意: 每台计算机包含P个部件,当所有这些部件都准备齐全后,计算机就组装完成了.计算机的生产过程通过N台不同的机器来完成,每台机器用它的性 ...
- POJ 3436 ACM Computer Factory (拆点+输出解)
[题意]每台计算机由P个零件组成,工厂里有n台机器,每台机器针对P个零件有不同的输入输出规格,现在给出每台机器每小时的产量,问如何建立流水线(连接各机器)使得每小时生产的计算机最多. 网络流的建图真的 ...
- POJ 3436 ACM Computer Factory
题意: 为了追求ACM比赛的公平性,所有用作ACM比赛的电脑性能是一样的,而ACM董事会专门有一条生产线来生产这样的电脑,随着比赛规模的越来越大,生产线的生产能力不能满足需要,所以说ACM董事会想 ...
- poj 3436 ACM Computer Factory 最大流+记录路径
题目 题意: 每一个机器有一个物品最大工作数量,还有一个对什么物品进行加工,加工后的物品是什么样.给你无限多个初始都是000....的机器,你需要找出来经过这些机器操作后最多有多少成功的机器(111. ...
随机推荐
- poj 1205 :Water Treatment Plants (DP+高精度)
题意:有n个城市,它们由一个污水处理系统连接着,每个城市可以选择 1.将左边城市过来的污水和右边城市过来的污水连同本身的污水排到河里 >V< 2.将左边来的污水连同自己的污水排到右边 ...
- PID算法 旋转倒立摆与平衡车的区别。此贴后边会更新。
我做PID算法的背景和经历:本人之前电子信息科学与技术专业,对控制方向颇感兴趣,刚上大学时听到实验室老师说PID算法,那年在暑假集训准备全国电子设计竞赛,我正在练习做一个以前专科的题目,帆板角度控制系 ...
- maven的编译规范
maven的中央仓库上的jar的包名必须小写.否则maven编译不通过. 如:Memcached-Java-Client-3.0.2 的jar包. 目录如下: com.whalin.memcached ...
- S2:log4j
配置步骤 1.引入jar,放到lib中,jar包被项目管理 2.在src目录下copy了一个文件log4j.properties 3.使用Logger String word="会员登记 ...
- S2:.net
1.net框架结构 主要包含公共语言运行时(CLR)和框架类库(.NET Framework 类库 ,FCL) 2.CLR 1.对于一个将要面向.NET平台进行开发的人来说,了解一下.NET平台的整 ...
- Java内部类超详细总结(含代码示例)
什么是内部类 什么是内部类? 顾名思义,就是将一个类的定义放在另一个类的内部. 概念很清楚,感觉很简单,其实关键在于这个内部类放置的位置,可以是一个类的作用域范围.一个方法的或是一个代码块的作用域范围 ...
- oracle 正确删除归档日志,并清除 V$ARCHIVED_LOG 数据
1. 连接 RMAN 管理 rman target / 2. 查看归档日志列表 RMAN> crosscheck archivelog all; 3. 删除所有归档日志 RMAN> DEL ...
- 【Java例题】2.3 计算银行存款本息
3.计算银行存款本息. 用户输入存款金额money,存款期years和年利率rate, 根据公式: sum=money(1+rate)^years ,计算到期存款本息. 这里的"^" ...
- 第三方登录之QQ
public class MainActivity extends AppCompatActivity { private Button btn; private TextView tv; priva ...
- JAVA-SpringMVC 概述及组件介绍
一.SpringMVC概述 SpringMVC是一个WEB层.控制层框架,主要用来负责与客户端交互,业务逻辑的调用. SpringMVC是Spring家族中的一大组件,Spring整合SpringMV ...