【codevs1237】[网络流24题]餐巾计划问题

= =感觉这两天做的最有质量的一道题,尽管以前做过但还是想了一会,建图建的很巧妙.
首先我们很容易可以看出这是一个费用流,然后我们先拆点,把每天分成两个点,一个表示干净的餐巾,一个表示脏的餐巾,这里表示为xi和yi.
然后我们考虑对于每个要表示的量怎么在图中表示出来呢?
首先我们可以想到每天产生的脏餐巾和消耗的干净餐巾数量是相等的,所以我们没有必要在两点之间连边,我们可以用yi来表示产生的干净餐巾,所以三种途径可以表示为
(我用tf表示快洗用的天数,ts表示慢洗用的天数,cf表示快洗花的钱,cs表示慢洗花的钱)
从源点向每个yi连一条费用为p,容量为inf的边
从xi向y(i+tf)连一条容量为inf费用为cf的边
从xi向y(i+ts)连一条容量为inf费用为cs的边
然后我们再来表示每天需要的餐巾,很好表示
从每个yi向汇点引容量为di,费用为0的边
剩下的就很好表示了
还剩下延期处理的餐巾就是每个xi向x(i+1)连容量为inf费用为1的边
所以图就建好啦,直接跑最小费用最大流就好.
这道题在洛谷上也有,而且双倍经验,但是其中一道时限为4s的题卡常!!
逼我用zkw费用流我偏不用,然后就加了各种黑科技手写队列然后fread读入优化,循环展开(其实没怎么展开23333),register,inline,前置++加速都用了终于被我卡过去啦哈哈哈哈哈哈哈哈哈,卡常道路还需要慢慢学习.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=10010,inf=0x3f3f3f3f;
int a[N],p[N],inq[N],d[N],head[N],q[N],val[N];
int n,ts,s,t,cs,c,cf,qlast,qfront,tf,te,sz;
struct edge{
    int u,v,cap,cost,flow,next;
}e[100010];
inline void pop(){++qlast;}
inline void push(int qq){q[++qfront]=qq;}
inline int F()
{
    register int aa,bb;register char ch;
    while(ch=getchar(),(ch<'0'||ch>'9')&&ch!='-');ch=='-'?aa=bb=0:(aa=ch-'0',bb=1);
    while(ch=getchar(),ch<='9'&&ch>='0')aa=(aa<<3)+(aa<<1)+ch-'0';return bb?aa:-aa;
}
void add(int u,int v,int cap,int cost)
{
    e[++te].cap=cap;
    e[te].u=u;
    e[te].v=v;
    e[te].flow=0;
    e[te].next=head[u];
    head[u]=te;
    e[te].cost=cost;
}
void insert(int u,int v,int cap,int cost){add(u,v,cap,cost);add(v,u,0,-cost);}
int spfa(int &flow,ll &cost)
{
    qfront=0,qlast=1;
    memset(d,0x3f,sizeof(d));
    a[s]=inf,inq[s]=1,d[s]=0,push(s);
    while(qlast<=qfront)
    {
        register int u=q[qlast];
        for (int i=head[u];i;i=e[i].next)
        {
            register int v=e[i].v;
            if(e[i].cap>e[i].flow&&d[v]>d[u]+e[i].cost)
            {
                p[v]=i;
                a[v]=min(a[u],e[i].cap-e[i].flow);  
                d[v]=d[u]+e[i].cost;
                if (!inq[v])
                {
                    push(v);
                    inq[v]=1;
                }
            }
        }
        inq[u]=0;
        pop();
    }
    if (d[t]==inf)return false;
    cost+=1ll*d[t]*a[t];
    flow+=a[t];
    for (register int u=t;u!=s;u=e[p[u]].u)
    {
        e[p[u]].flow+=a[t];
        e[p[u]^1].flow-=a[t];
    }
    return true;
}
int mcmf(ll &cost)
{
    register int flow=0;
    cost=0;
    while(spfa(flow,cost));
    return flow;
}
int main()
{
    te=1;
    memset(inq,0,sizeof(inq));
    memset(head,0,sizeof(head));
    n=F();
    for(register int i=1;i<=n;++i)
    val[i]=F();
    s=(n<<1)+1,t=s+1;
    c=F(),tf=F(),cf=F(),ts=F(),cs=F();
    for(register int i=1;i<=n;++i)
    {
        insert(s,i,val[i],0);
        insert(i+n,t,val[i],0);
        insert(s,i+n,inf,c);
        if (i<n)insert(i,i+1,inf,0);
        if (i+tf<=n)insert(i,i+tf+n,inf,cf);
        if (i+ts<=n)insert(i,i+ts+n,inf,cs);
    }
//  for (int i=2;i<=te;i+=2)
//  cout<<e[i].u<<' '<<e[i].v<<' '<<e[i].cap<<' '<<e[i].cost<<endl;
    ll cost;
    mcmf(cost);
    cout<<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、付费专栏及课程。

余额充值