poj3686(最小费用流)(2),高端web前端开发

文章介绍了如何通过最小费用流模型解决工厂中玩具加工时间的问题,通过拆分工厂、设置超级源点和汇点,以及计算最大流来确定最优的生产时间分布,最终求得总加工时间并进行优化。
摘要由CSDN通过智能技术生成

就相当于第一个在一工厂加工完花了 1 时间,第二个在二工厂加工完花了 1 时间,第三个在一工厂要等第一个做完再做,花了 2 时间,所以总共花了 4 时间,平均花了1.333333

假设一个工厂里有num个玩具来加工,则在该工厂所花的时间为 T = num * t_1 + (num - 1) * t_2 +…+1 * t_num(t_第几个制作)

我们把一个工厂拆开来看,把 M 个拆成 M * N 个(因为 num <= N ), i * N + j 个工厂,相当于第 i 个工厂中第 num - j + 1 个制作玩具,即该工厂倒数第 j 个制作玩具

然后我们设置一个超级源点,连接 N 个玩具,边的容量为1,费用为0,这样便限制了一个玩具只能制造一次

再设置一个超级汇点,连接 N * M 个工厂,边的容量为1,费用为0,这样限制了一个工厂不会同时生产两个玩具

再把 N 个玩具和 N * M 个工厂分别相连( i * N + j ), 边的容量为0,费用为 制造时间 * j,这样当最大流为N时,M个工厂都能正确的得到生产时间,也就能正确得到生产总时间

(需要注意,由于我们求的时最小费用流,所以当 j 存在较小的没有使用时,是不会使用较大的,因为这样的 制造时间 * j 更小,所以这样可以导致我们的一个工厂拆开的 j 个工厂,相当于 j 从小到大被连接,这样相当于把 T = num * t_1 + (num - 1) * t_2 +…+1 * t_num 倒过来考虑了,是符合题意的)

套最小费用流模板,把最后得到的值除以 N 即可。

#include

#include <stdio.h>

#include

#define INF 1000000005

using namespace std;

int n, m;

int data[55][55];

struct edge

{

int to, cap, coust, rev;

edge(int t, int c, int s, int r)

{

to = t; cap = c; coust = s; rev = r;

}

};

vector ddd[3005];

int dist[3005];

int prev[3005];

int prep[3005];

void add_edge(int from, int to, int cap, int coust)

{

ddd[from].push_back(edge(to, cap, coust, ddd[to].size()));

ddd[to].push_back(edge(from, 0, -coust, ddd[from].size() - 1));

}

int min_coust(int from, int to, int flow)

{

int res = 0;

while(flow > 0)

{

fill(dist, dist + n + n * m + 2, INF);

dist[from] = 0;

bool flag = true;

while(flag)

{

flag = false;

for(int i = 0; i < n + n * m + 2; i++)

{

if(dist[i] != INF)

{

for(int j = 0; j < ddd[i].size(); j++)

{

struct edge e = ddd[i][j];

if(e.cap != 0 && dist[i] + e.coust < dist[e.to])

{

flag = true;

dist[e.to] = dist[i] + e.coust;

prev[e.to] = i;

prep[e.to] = j;

}

}

}

}

}

int d = flow;

for(int i = to; i != from; i = prev[i])

{

d = min(d, ddd[prev[i]][prep[i]].cap);

}

for(int i = to; i != from; i = prev[i])

{

ddd[prev[i]][prep[i]].cap -= d;

ddd[i][ddd[prev[i]][prep[i]].rev].cap += d;

}

res = res + dist[to] * d;

flow = flow - d;

}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

给大家分享一些关于HTML的面试题,有需要的朋友可以戳这里免费领取,先到先得哦。


最后

给大家分享一些关于HTML的面试题,有需要的朋友可以戳这里免费领取,先到先得哦。

[外链图片转存中…(img-u0P7ld73-1712198748196)]
[外链图片转存中…(img-XSBbmM8I-1712198748196)]

  • 25
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值