[网络流24题] 10 餐巾 (线性规划网络优化 ,最小费用最大流)

题目大意:

一家餐厅在相继的N天里,每天要用ri块餐巾。餐厅可以选择购买新的餐巾,每块的费用为p分;也可以把旧餐巾送到快洗部,洗一块需m天,花费f分;或者送到慢洗部,洗一块需要n(n>m)天,费用为s(s<f)分。求合理餐巾使用计划下可能的最小总花费。

输入:

输入文件共 3 行,第 1 行为总天教;第 2 行为每天所需的餐巾块数;第 3 行为每块餐巾的新购费用 p ,快洗所需天数 m ,快洗所需费用 f ,慢洗所需天数 n ,慢洗所需费用 s。

思路分析:

将每一天分成二分图两个集合中的顶点X,Y(其中X集表示每天用完的餐巾,Y集表示每天要用的餐巾),建立源点s,汇点t;

①:从s向每个Xi连一条容量为ri, 费用为0的有向边, 表示每天用完ri块餐巾;

②:从每个Yi向t连一条容量为ri, 费用为0的有向边 ,表示每天要用ri块餐巾;

③:从s向每个Yi连一条容量为INF,费用为p的有向边,表示每天买新的餐巾,每块花费p分;

④:从每个Xi向Xi+1(i+1<=N)连一条容量为INF,费用为0的有向边,表示第i天剩下的餐巾留在第i+1天处理;

⑤:从每个Xi向Yi+m(i+m<=N)连一条容量为INF,费用为f的有向边,表示第i天剩下的餐巾送到快洗部,m天之后可以重新使用,花费为f;

⑥:从每个Xi向Yi+n(i+n<=N)连一条容量为INF,费用为s的有向边,表示第i天剩下的餐巾送到慢洗部,n天之后可以重新使用,花费为s;

代码实现:

#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
#define Min(a,b) ((a)<(b)?(a):(b))
#define Max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int N=410, M=2410, INF=0x3f3f3f3f;
int n, m, s, t, top, sum_cost;
int head[N], vis[N], path[N], minflow[N], num[210], dis[N], pre[N];

struct Edge{
    int to, next, flow, cost;
    Edge(int _to = 0, int _next = 0, int _flow = 0, int _cost = 0):to(_to), next(_next), flow(_flow), cost(_cost){}
}edge[M];

void Addedge(int from, int to, int flow, int cost){
    edge[top] = Edge(to, head[from], flow, cost);
    head[from] = top++;
    edge[top] = Edge(from, head[to], 0, -cost);
    head[to] = top++;
}

int Spfa(){
    queue<int> q;
    memset(dis, 0x3f, sizeof(dis));
    memset(minflow, 0x3f, sizeof(minflow));
    memset(path, -1, sizeof(path));
    memset(vis, 0, sizeof(vis));
    dis[s] = 0, q.push(s);
    while(!q.empty()){
        int u = q.front(); q.pop();
        vis[u] = 0;
        for(int i = head[u]; i + 1; i = edge[i].next){
            if(edge[i].flow && dis[edge[i].to] > dis[u] + edge[i].cost){
                dis[edge[i].to] = dis[u] + edge[i].cost;
                pre[edge[i].to] = u;
                path[edge[i].to] = i;
                minflow[edge[i].to] = Min(minflow[u], edge[i].flow);
                if(!vis[edge[i].to]){
                    vis[edge[i].to] = 1;
                    q.push(edge[i].to);
                }
            }
        }
    }
    if(dis[t] == INF) return 0;
    sum_cost += minflow[t] * dis[t];
    int u = t;
    while(u != s){
        edge[path[u]].flow -= minflow[t];
        edge[path[u]^1].flow += minflow[t];
        u = pre[u];
    }
    return 1;
}

int main(){
    freopen("napkin.in", "r", stdin);
    freopen("napkin.out", "w", stdout);
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) scanf("%d", &num[i]);
    int p_n, t_q, p_q, t_s, p_s;
    scanf("%d%d%d%d%d", &p_n, &t_q, &p_q, &t_s, &p_s);
    memset(head, -1, sizeof(head));
    top = s = sum_cost = 0;
    t = n * 2 + 1;
    for(int i = 1; i <=n; ++i){
        Addedge(s, i, num[i], 0);
        Addedge(i+n, t, num[i], 0);
        Addedge(s, i+n, INF, p_n);
        if(i < n) Addedge(i, i+1, INF, 0);
        if(i+t_q <= n) Addedge(i, i+n+t_q, INF, p_q);
        if(i+t_s <= n) Addedge(i, i+n+t_s, INF, p_s);
    }
    while(Spfa());
    printf("%d\n", sum_cost);
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 工业视觉填空是一种常见的考察工业视觉技术掌握程度的测试方式。填空通常给出一张或多张包含目标物体或场景的图像,要求我们根据图像提供的信息填写空缺的部分。 在面对这类目时,我们需要注意以下几点。 首先,要仔细观察图像中的目标物体或场景。通过观察可以获取关于目标物体的形状、颜色、纹理等信息。同时,还需要注意图像中目标物体的位置、大小和角度等细节。 其次,根据观察到的信息进行推理。通过分析目标物体的特征,可以推测出填写在空缺处的相关信息。例如,如果图像中是一张餐桌,空缺处可能是餐盘或餐巾纸等与餐桌相关的物品。 此外,我们还可以利用已知的规则、常识和经验来进行推断。工业视觉填空通常涉及到工业生产过程中的各种物体和场景,我们可以结合自己的相关知识,推断出最合理的填空答案。 最后,需要小心排除干扰项。有时候,在填空中会出现一些与目标物体相似或具有迷惑性的选项,我们要尽量将这些选项排除在外,选出最符合实际情况的答案。 总之,工业视觉填空是一个考验观察力和推理能力的型。通过仔细观察、合理推理和排除干扰项,我们可以更准确地解答这类目。 ### 回答2: 工业视觉是一种通过计算机视觉技术实现的机器视觉应用,主要用于工业生产线上对产品进行检测、识别和定位等任务。而“bing”在这个背景下是一种用于填充空缺的技术。 工业视觉填空 bing 是指在工业视觉应用中,通过使用计算机视觉算法来填充图像中的空缺或缺失的信息。这些空缺可能是由于摄像机视野受限或者物体表面的纹理不规则等因素引起的。填空 bing 的目的是通过算法分析和处理,准确地还原出缺失的信息,从而达到检测和识别的目的。 在工业生产线上,工业视觉填空 bing 可以应用于多个领域。例如,在电子产业中,当产品经过视觉检测系统时,可能会出现一些零件的脱落或者损坏,这样就会导致图像中出现缺失的区域。通过填空 bing 技术,可以将这些缺失的区域补全,从而准确地检测出产品的质量。 另外,在制造业中,工业视觉填空 bing 也可以应用于产品定位。当生产线上的机器需要精确地将零件组装在一起时,完整的视觉信息是非常重要的。如果零件的某些部分无法被视觉系统检测到,就会导致产品组装的错误或者不准确。通过填空 bing 技术,可以将缺失的信息修复,确保产品的正确定位和组装。 综上所述,工业视觉填空 bing 是一种工业视觉应用中的算法技术,主要用于对图像中的缺失信息进行补全,以实现精确的产品检测和定位。通过填空 bing 技术,可以提高工业生产线上的自动化程度,提高产品质量和生产效率。 ### 回答3: 工业视觉是一种基于计算机视觉技术的应用,主要用于自动化生产中的检测、识别和测量等任务。它可以帮助提高生产效率、确保产品质量,减少人工错误和成本。在工业视觉中,填空是一种常见的测试方式,用于检测产品或生产过程中的缺陷或异常。 填空在工业视觉中的应用通常包括以下几个方面: 首先,填空可以用于产品的外观缺陷检测。通过对产品外观的图像进行分析,识别出可能存在的缺陷或异常,如表面破损、划痕或涂层不均匀等。这可以帮助生产线上的工作人员快速发现问,及时进行修复或处理,保证产品质量。 其次,填空可以用于零件的正确安装和组装。通过对零件或组件的图像进行分析,检查是否存在缺失或错误安装的情况。例如,可以通过填空来检测汽车装配线上的螺丝是否正确安装,以及电子产品中各个元件的位置是否准确。这可以帮助避免产品在使用过程中发生故障或损坏。 此外,填空还可以用于产品尺寸的测量和判断。通过对产品图像进行分析,测量其尺寸并与标准进行比较,判断是否符合规定要求。例如,可以通过填空来检测零件的长度、直径或厚度是否在允许的范围内。这可以帮助发现生产过程中的偏差,及时调整生产参数,保证产品质量一致性。 综上所述,填空在工业视觉中的应用可以帮助实现生产过程的自动化和智能化,提升生产效率和产品质量。通过对产品外观、安装和尺寸等进行识别和测量,填空可以帮助企业实现更精确、更可靠的生产。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值