bzoj 1221 软件开发 费用流

本文探讨了在有限资源条件下,如何通过优化算法实现毛巾的高效购买与洗涤过程,包括需求预测、成本控制及资源分配策略。

应该比较好看出来是费用流,那么就考虑怎么构图

首先我们把一天拆成两个点,XI,YI,分别代表这一天买了多少

和洗多少,再加入源和汇S,T

1.每一天我们可以买新的毛巾,所以连接一条从S到XI的边,流量为正无穷(因为可以买好多),费用为f

2.然后我们对于买来的毛巾可以洗,每天都产生need[i]的毛巾可以洗,那么连一条从S到YI的边,

流量为need[i],费用为0(因为只决定要洗,没有确定洗的方案,所以先不算费用)

3.每一条要用a方法洗的毛巾,我们连一条从YI到X(I+a+1)的边,流量为正无穷(下文解释),费用为fa的

4.每一条要用b方法洗的毛巾,我们连一条从YI到X(I+b+1)的边,流量为正无穷(下文解释),费用为fb的

5.因为每天剩下的毛巾,我们可以不当天洗,所以连接一条从YI到Y(I+1)的边,流量为正无穷,费用为0(所以每天可以洗

的毛巾的个数是可能会很多的,4,5建的边流量要是正无穷)

6.那么我们每天买的毛巾除了洗,还可以不洗,也就是直接扔掉,所以连一条XI到T的边,流量为need[i],费用为0

/**************************************************************
    Problem: 1221
    User: BLADEVIL
    Language: Pascal
    Result: Accepted
    Time:1952 ms
    Memory:8120 kb
****************************************************************/
 
//By BLADEVIL
var
    n, a, b, f, fa, fb  :longint;
    need                :array[0..1010] of longint;
    pre, other,len      :array[0..500010] of longint;
    cost                :array[0..500010] of longint;
    last                :array[0..4010] of longint;
    ss, tt              :longint;
    que                 :array[0..5000] of longint;
    dis                 :array[0..5000] of longint;
    flag                :array[0..5000] of boolean;
    father              :array[0..5000] of longint;
    ans                 :int64;
    l                   :longint;
      
function min(a,b:longint):longint;
begin
    if a>b then min:=b else min:=a;
end;
      
procedure connect(a,b,c,d:longint);
begin
    inc(l);
    pre[l]:=last[a];
    last[a]:=l;
    other[l]:=b;
    len[l]:=c;
    cost[l]:=d;
end;
      
procedure init;
var
    i                   :longint;
    use                 :longint;
begin
    read(n,a,b,f,fa,fb);
    for i:=1 to n do read(need[i]);
    l:=1;
    ss:=2*n+1;
    tt:=2*n+2;
    for i:=1 to n do
    begin
        connect(ss,2*i-1,maxlongint,f);
        connect(2*i-1,ss,0,-f);
        connect(2*i-1,tt,need[i],0);
        connect(tt,2*i-1,0,0);
        connect(ss,2*i,need[i],0);
        connect(2*i,ss,0,0);
        use:=i+a+1;
        if use<=n then
        begin
            use:=use*2-1;
            connect(2*i,use,maxlongint,fa);
            connect(use,2*i,0,-fa);
        end;
        use:=i+b+1;
        if use<=n then
        begin
            use:=use*2-1;
            connect(2*i,use,maxlongint,fb);
            connect(use,2*i,0,-fb);
        end;
    end;
    for i:=1 to n-1 do
    begin
        connect(2*i,2*i+2,maxlongint,0);
        connect(2*i+2,2*i,0,0);
    end;
end;
  
function spfa:boolean;
var
    q, p, cur               :longint;
    h, t                    :longint;
begin
    filldword(dis,sizeof(dis) div 4,maxlongint div 10);
    que[1]:=ss;
    dis[ss]:=0;
    h:=0; t:=1;
    while t<>h do
    begin
        h:=h mod 5000+1;
        cur:=que[h];
        flag[cur]:=false;
        q:=last[cur];
        while q<>0 do
        begin
            p:=other[q];
            if len[q]>0 then
            begin
                if dis[p]>dis[cur]+cost[q] then
                begin
                    father[p]:=q;
                    dis[p]:=dis[cur]+cost[q];
                    if not flag[p] then
                    begin
                        t:=t mod 5000+1;
                        que[t]:=p;
                        flag[p]:=true;
                    end;
                end;
            end;
            q:=pre[q];
        end;
    end;
    if dis[tt]=maxlongint div 10 then exit(false) else exit(true);
end;
  
procedure update;
var
    cur                     :longint;
    low                     :longint;
   
begin
    low:=maxlongint div 10;
    cur:=tt;
    while cur<>ss do
    begin
        low:=min(low,len[father[cur]]);
        cur:=other[father[cur] xor 1];
    end;
    cur:=tt;
    while cur<>ss do
    begin
        dec(len[father[cur]],low);
        inc(len[father[cur] xor 1],low);
        inc(ans,low*cost[father[cur]]);
        cur:=other[father[cur] xor 1]; 
    end;
end;
  
procedure main;
begin
    while spfa do update;
    writeln(ans);
end;
  
begin
    init;
    main;
end.

 

转载于:https://www.cnblogs.com/BLADEVIL/p/3470508.html

一、数据采集层:多源人脸数据获取 该层负责从不同设备 / 渠道采集人脸原始数据,为后续模型训练与识别提供基础样本,核心功能包括: 1. 多设备适配采集 实时摄像头采集: 调用计算机内置摄像头(或外接 USB 摄像头),通过OpenCV的VideoCapture接口实时捕获视频,支持手动触发 “拍照”(按指定快捷键如Space)或自动定时采集(如每 2 秒采集 1 张),采集时自动框选人脸区域(通过Haar级联分类器初步定位),确保样本聚焦人脸。 支持采集参数配置:可设置采集分辨率(如 640×480、1280×720)、图像格式(JPG/PNG)、单用户采集数量(如默认采集 20 张,确保样本多样性),采集过程中实时显示 “已采集数量 / 目标数量”,避免样本不足。 本地图像 / 视频导入: 支持批量导入本地人脸图像文件(支持 JPG、PNG、BMP 格式),自动过滤非图像文件;导入视频文件(MP4、AVI 格式)时,可按 “固定帧间隔”(如每 10 帧提取 1 张图像)或 “手动选择帧” 提取人脸样本,适用于无实时摄像头场景。 数据集对接: 支持接入公开人脸数据集(如 LFW、ORL),通过预设脚本自动读取数据集目录结构(按 “用户 ID - 样本图像” 分类),快速构建训练样本库,无需手动采集,降低系统开发与测试成本。 2. 采集过程辅助功能 人脸有效性校验:采集时通过OpenCV的Haar级联分类器(或MTCNN轻量级模型)实时检测图像中是否包含人脸,若未检测到人脸(如遮挡、侧脸角度过大),则弹窗提示 “未识别到人脸,请调整姿态”,避免无效样本存入。 样本标签管理:采集时需为每个样本绑定 “用户标签”(如姓名、ID 号),支持手动输入标签或从 Excel 名单批量导入标签(按 “标签 - 采集数量” 对应),采集完成后自动按 “标签 - 序号” 命名文件(如 “张三
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值