题目链接:http://poj.org/problem?id=3436

题目大意:

  一台电脑可以分成P个部分,在生产过程中,半成品电脑有的部分已经完成(记为1),而有的部分还没有完成(记为0)。电脑生产商用N台机器生产电脑,对于放入各台机器的电脑,各自有其要求,即有些部分必须已经完成(记为1),有些部分必须还未完成(记为0),有些部分是否完成无关紧要(记为2),求怎么安排生产线使工厂的总生产效率最高。

解题思路:

  最大流问题。

  首先是建图。如果某台机器对于放入其中的电脑的要求全为0或者2,那么这台机器就是一个源点,如果某台机器生产出的电脑所有部分都为1,那么这台机器就可以看成一个汇点。这样就有多个源点和多个汇点,那么我们可以设置一个超级源点和超级汇点,超级源点指向每一个源点,每一个汇点指向超级汇点,流量限制为inf。对于每一台机器,为了表示其效率上限,我们将其拆成两个点,表示入口和出口,中间用一条流量限制为机器生存效率的线连接。而对于不同的机器,如果一台机器生产出来的电脑能够送往另一台电脑,那么就将这台机器的出口指向另一台机器的入口,流量限制为inf。建图完成,其他的交给模板。

  另一个难点是要printf出最大流经过的路径。那么我们就可以来研究模板跑完以后留下的残量网络。首先有三种路是我们为了方便解决问题而加入的,printf路径的时候必须无视掉:从超级源点流出的路,流入超级汇点的路,由机器入口流到出口的路。那么对于剩下的路,如果路上流量大于0,(或者说残量小于流量限制),那么这条路就是我们这个最大流网络中会经过的,打印出起点、终点和流量即可。

AC代码:

 #include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
const int inf = 0x7ffffff, maxn = + ;
struct node {
int s[], t[];
int v;
}machine[];
//模板作者:刘汝佳
//**************************************************
struct ans {
int from, to, num;
}ret[maxn];
struct Edge {
int from, to, cap, flow;
Edge(int u, int v, int c, int f) :from(u), to(v), cap(c), flow(f) {}
};
vector<int>ans[maxn];
int len = , dis[maxn][maxn];
struct Dinic {
int n, m, s, t;
vector<Edge> edges;
vector<int> G[maxn];
bool vis[maxn];
int d[maxn];
int cur[maxn]; void init(int n) {
this->n = n;
for (int i = ; i < n; i++) G[i].clear();
edges.clear();
}
void addedge(int from, int to, int cap) {
edges.push_back(Edge(from, to, cap, ));
edges.push_back(Edge(to, from, , ));
m = edges.size();
G[from].push_back(m - );
G[to].push_back(m - );
}
bool BFS() {
memset(vis, , sizeof(vis));
queue<int> Q;
Q.push(s);
d[s] = ;
vis[s] = ;
while (!Q.empty()) {
int x = Q.front(); Q.pop();
for (int i = ; i < G[x].size(); i++) {
Edge &e = edges[G[x][i]];
if (!vis[e.to] && e.cap>e.flow) {
vis[e.to] = ;
d[e.to] = d[x] + ;
Q.push(e.to);
}
}
}
return vis[t];
}
int DFS(int x, int a) {
if (x == t || a == ) return a;
int flow = , f;
for (int &i = cur[x]; i < G[x].size(); i++) {
Edge &e = edges[G[x][i]];
if (d[x] + == d[e.to] && (f = DFS(e.to, min(a, e.cap - e.flow)))>) {
e.flow += f;
edges[G[x][i] ^ ].flow -= f;
flow += f;
a -= f;
if (a == ) break;
}
}
return flow;
}
int Maxflow(int s, int t) {
this->s = s; this->t = t;
int flow = ;
while (BFS()) {
memset(cur, , sizeof(cur));
flow += DFS(s, inf);
}
return flow;
}
};
//****************************************************
int main() {
// freopen("in.txt","r",stdin);
int P, N;
Dinic temp;
scanf("%d%d", &P, &N);
temp.init( * N + );
for (int i = ; i <= N; i++) {
scanf("%d", &machine[i].v);
for (int j = ; j<P; j++) scanf("%d", &machine[i].s[j]);
for (int j = ; j<P; j++) scanf("%d", &machine[i].t[j]);
bool sour = true;
for (int j = ; j<P; j++) {
if (machine[i].s[j] == ) {
sour = false;
break;
}
}
if (sour) temp.addedge(, i, inf);
bool ending = true;
for (int j = ; j<P; j++) {
if (machine[i].t[j] != ) {
ending = false;
break;
}
}
if (ending) temp.addedge(i + N, * N + , inf);
temp.addedge(i, i + N, machine[i].v);
}
for (int i = ; i <= N; i++) {
for (int j = i + ; j <= N; j++) {
bool yes1 = true, yes2 = true;
for (int k = ; k<P; k++) {
if (machine[i].t[k]) {
if (machine[j].s[k] == ) yes1 = false;
}
else {
if (machine[j].s[k] == ) yes1 = false;
}
if (machine[j].t[k]) {
if (machine[i].s[k] == ) yes2 = false;
}
else {
if (machine[i].s[k] == ) yes2 = false;
}
if (!yes1&&!yes2) break;
}
if (yes1)
temp.addedge(i + N, j, inf);
if (yes2)
temp.addedge(j + N, i, inf);
}
}
printf("%d ", temp.Maxflow(, * N + ));
int cnt = ; for (int i = ; i<temp.edges.size(); i++) {
Edge t = temp.edges[i];
int fw = t.flow, f = t.from, tt = t.to;
if (fw <= || t.cap == || t.cap != inf || tt>N || f<) continue;
ret[cnt].from = f - N, ret[cnt].to = tt, ret[cnt].num = fw;
cnt++;
}
printf("%d\n", cnt);
for (int i = ; i<cnt; i++) {
printf("%d %d %d\n", ret[i].from, ret[i].to, ret[i].num);
}
return ;
}

POJ3436的更多相关文章

  1. POJ3436 Command Network [最小树形图]

    POJ3436 Command Network 最小树形图裸题 傻逼poj回我青春 wa wa wa 的原因竟然是需要%.2f而不是.2lf 我还有英语作业音乐作业写不完了啊啊啊啊啊啊啊啊啊 #inc ...

  2. POJ-3436 ACM Computer Factory---最大流+拆点

    题目链接: https://vjudge.net/problem/POJ-3436 题目大意: 每台电脑有p个组成部分,有n个工厂加工电脑.每个工厂对于进入工厂的半成品的每个组成部分都有要求,由p个数 ...

  3. POJ3436 ACM Computer Factory —— 最大流

    题目链接:https://vjudge.net/problem/POJ-3436 ACM Computer Factory Time Limit: 1000MS   Memory Limit: 655 ...

  4. POJ-3436 ACM Computer Factory 最大流 为何拆点

    题目链接:https://cn.vjudge.net/problem/POJ-3436 题意 懒得翻,找了个题意. 流水线上有N台机器装电脑,电脑有P个部件,每台机器有三个参数,产量,输入规格,输出规 ...

  5. ACMComputerFactory(POJ-3436)【最大流】

    题目链接:https://vjudge.net/problem/POJ-3436 题意:要用N台机器来组装电脑,每台电脑由P个零部件构成,每一台机器的输入电脑和输出电脑的每部分都有各自的属性,机器本身 ...

  6. 最大流拆点——hdu2732,poj3436

    一种很普遍的做法就是把一个带有容量的点拆成两个点,一个入点一个出点,链接两个点的边的权值为这个点的容量 hdu3732 #include<cstdio> #include<cstri ...

  7. POJ-3436(网络流+最大流+输出路径)

    ACM Computer Factory POJ-3436 题目就是一个工厂n个加工机器,每个机器有一个效率w,q个材料入口,q个材料出口,每个口有三个数表示状态,1表示一定有入/出的材料,0表示没有 ...

  8. ACM/ICPC 之 ACM计算机工厂-EK算法(POJ3436)

    题意有点难读懂 //网络流-EK算法-ACM计算机工厂-构图重点 //Time:0Ms Memory:208K #include <iostream> #include<cstrin ...

  9. POJ3436 ACM Computer Factory(最大流)

    题目链接. 分析: 题意很难懂. 大体是这样的:给每个点的具体情况,1.容量 2.进入状态 3.出去状态.求最大流. 因为有很多点,所以如果一个点的出去状态满足另一个点的进入状态,则这两个点可以连一条 ...

  10. POJ3436 ACM Computer Factory 【最大流】

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5412   Accepted: 1 ...

随机推荐

  1. Windows 10配置VS Code C++环境(超详细,面向小白以及大佬们)

    看完这个,还有下一篇:门在这 我看了网上的大佬们配的我是在是看不懂啊?我是一个小白啊?这太难了,这阻挡不了我,想使用这很骚的IDE,于是在不断的摸索下,终于配置成功,小白们也不用慌,这次非常简单.一定 ...

  2. 2019 ICPC 银川网络赛 H. Fight Against Monsters

    It is my great honour to introduce myself to you here. My name is Aloysius Benjy Cobweb Dartagnan Eg ...

  3. HTML data-* 属性的含义和使用

      data-*自定义数据属性 首先讲一下语法格式: data-* =“值” data-* 属性包括两部分: 属性名不应该包含任何大写字母,并且在前缀 "data-" 之后必须有至 ...

  4. Educational Codeforces Round 83 E. Array Shrinking

    E. Array Shrinking 题目大意: 给你一个大小是n的序列,相邻的序列如果相等,则可以合并,合并之后的值等于原来的值加1. 求:合并之后最小的序列的和. 题解: 这个数据范围和这个相邻的 ...

  5. Codeforces Round #626 D. Present

    D. Present 题目大意:给你一个大小是n的序列,求两两之间相加进行异或之后的答案. 这个题目我并没有想到怎么写,有点偷懒于是就去看了题解.. 题解很套路... 题解: 因为这个是用到了异或,所 ...

  6. Word转pdf,再转图片插入PDF

    WORD转PDF所需jar包: https://yangtaotao.lanzous.com/ice1jlc PDF转图片所需jar包: https://yangtaotao.lanzous.com/ ...

  7. 【T-SQL】基础——表别名

    Som有时候我们需要为表设置别名,这样就可以方便的修改表. 如果在SSMS中,可以点击 Query-> SQL CMD mode --Set Alisa for the table:setvar ...

  8. Day_11【集合】扩展案例1_遍历打印学生信息,获取学生成绩的最高分,获取成绩最高的学员,获取学生成绩的平均值,获取不及格的学员数量

    分析以下需求,并用代码实现: 1.按照以下描述完成类的定义 学生类 属性: 姓名name 年龄age 成绩score 行为: 吃饭eat() study(String content)(content ...

  9. Day_13【IO流】扩展案例1_读取项目文件内容并去重

    分析以下需求,并用代码实现: 需求: 读取当前项目下的info1.txt 文件内容如下 : aaaaaaaaaaabbbbbbbbbbbbccdefg 要求将数据去重后写回最终效果 : fgdebca ...

  10. docker redis shell

    docker中安装好redis后,运行 docker ps 指令,查看所有运行中的镜像信息 然后运行 docker inspect --format "{{ .State.Pid}}&quo ...