hdu4780 费用流 (机器任务工作不中断问题)

机器,任务 ,每个任务有有时间,不可中断。

题意:m个机器,n个糖果要加工,给出每个糖果的工作时间(s,t),以及糖果之间、机器预备时间以及费用,求最小费用。

这题开始受原来可以时间中断那题影响,开始用时间建图,巨麻烦,后来学习了,才觉悟时间只是计算费用的,没有帮毛钱关系, s-->机器-》糖果-》t;

因为要每个糖果都加工一次,糖果拆点,必经过(-inf)。有一个没过,则无解。

网上的添加一组新点法也可以。我的使用释放压力+无穷碧流法也好。

跪点:注意!用inf=0x3f3f3f3f,最后加上n*inf,爆int! 这种以后要注意!顺变 e[][3]也要longlong !

本来这样我就A了!但是竟然因为一个变量的命名搞混了WA一天!!!SB了!  自己搞变量不要搞这么相似啊 !!!!!!!!!!

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const long long inf=0x3f3f3f3f;
const int maxn=505,maxe=80000;
int n,m,k;
int ss,tt;
int head[maxn];long long e[maxe][4];int nume=0;
void inline adde(int i, int j, int c,long long w)
{
    e[nume][0]=j;e[nume][1]=head[i];head[i]=nume;
    e[nume][2]=c;e[nume++][3]=w;
    e[nume][0]=i;e[nume][1]=head[j];head[j]=nume;
    e[nume][2]=0;e[nume++][3]=-w;
}
int inq[maxn];long long d[maxn];int pre[maxn];int prv[maxn];
bool spfa(long long &sum)
{
    for(int i=0;i<=tt;i++)
       {
           inq[i]=0;d[i]=inf;
       }
    queue<int>q;
    q.push(ss);
    inq[ss]=1;d[ss]=0;
    while(!q.empty())
    {
        int cur=q.front();
        q.pop();
        inq[cur]=0;
        for(int j=head[cur];j!=-1;j=e[j][1])
        {
            int v=e[j][0];
            if(d[v]>d[cur]+e[j][3]&&e[j][2]>0)
            {
                d[v]=d[cur]+e[j][3];
                pre[v]=j;
                prv[v]=cur;
                if(!inq[v])
                {
                    q.push(v);
                    inq[v]=1;
                }
            }
        }
    }
    if(d[tt]==inf)return 0;
   int minf=inf;
    int cur=tt;
    while(cur!=ss)
    {
        minf=minf<e[pre[cur]][2]?minf:e[pre[cur]][2];
        cur=prv[cur];
    }
     cur=tt;
    while(cur!=ss)
    {
       e[pre[cur]][2]-=minf;
       e[pre[cur]^1][2]+=minf;
        cur=prv[cur];
    }
    sum+=d[tt]*minf;
    return 1;
}
long long mincost()
{
    long long sum=0;
    while(spfa(sum));
    return sum;
}
int mac[105][2];int cmtime[105][105];int cmony[105][105];
int cgtime[105][105];int cgmony[105][105];
void build()
{
    for(int i=1;i<=m;i++)
    {
        adde(ss,i,1,0);
        adde(i,tt,1,0);
       for(int j=1;j<=n;j++)
       {
           if(cmtime[j][i]<mac[j][1])
           {
               if(cmtime[j][i]<=mac[j][0])
               adde(i,j+m,1,cmony[j][i]);
               else
               adde(i,j+m,1,cmony[j][i]+k*(cmtime[j][i]-mac[j][0]));
           }
       }
    }
    for(int i=1;i<=n;i++)
     {
         adde(i+m,i+m+n,1,-inf);
         adde(i+m+n,tt,1,0);
        for(int j=1;j<=n;j++)
        {
         if(i!=j&&mac[j][1]>mac[i][1]+cgtime[i][j])
         {
             if(mac[i][1]+cgtime[i][j]<=mac[j][0])
             adde(i+m+n,j+m,1,cgmony[i][j]);
             else
             adde(i+n+m,j+m,1,cgmony[i][j]+k*(mac[i][1]+cgtime[i][j]-mac[j][0]));
         }
        }
     }
}
void init()
{
    nume=0;
    memset(head,-1,sizeof(head));
    ss=0,tt=m+n+n+1;
}
int main()
{

    while(~scanf("%d%d%d",&n,&m,&k)&&(n||m||k))
    {
        init();
        for(int i=1;i<=n;i++)
             scanf("%d%d",&mac[i][0],&mac[i][1]);

        for(int i=1;i<=n;i++)
         for(int j=1;j<=m;j++)
         {
             scanf("%d",&cmtime[i][j]);
         }
         for(int i=1;i<=n;i++)
           for(int j=1;j<=m;j++)
         {
             scanf("%d",&cmony[i][j]);
         }
         for(int i=1;i<=n;i++)
           for(int j=1;j<=n;j++)
         {
             scanf("%d",&cgtime[i][j]);
         }
        for(int i=1;i<=n;i++)
           for(int j=1;j<=n;j++)
         {
             scanf("%d",&cgmony[i][j]);
         }
        build();
        long long ans=mincost()+n*inf;
        if(ans>=inf)
         printf("-1\n");
        else
          printf("%I64d\n",ans);
    }
}
时间: 2024-11-08 06:08:26

hdu4780 费用流 (机器任务工作不中断问题)的相关文章

【BZOJ2245】[SDOI2011]工作安排 拆边费用流

[BZOJ2245][SDOI2011]工作安排 Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由一名员工制造,不可以由某名员工制造一部分配件后,再转交给另外一名员工继续进行制造. 我们用一个由0和1组成的m*n的矩阵A来描述每名员工能够制造哪些产品.矩阵的行和列分别被编号为1~m和1~n,Ai,j为1表示员工i能够制造产品j,为0

【bzoj2245】[SDOI2011]工作安排 费用流

题目描述 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由一名员工制造,不可以由某名员工制造一部分配件后,再转交给另外一名员工继续进行制造. 我们用一个由0和1组成的m*n的矩阵A来描述每名员工能够制造哪些产品.矩阵的行和列分别被编号为1~m和1~n,Ai,j为1表示员工i能够制造产品j,为0表示员工i不能制造产品j. 如果公司分配了过多工作给一名员工,这

P2488 [SDOI2011]工作安排 费用流

\(\color{#0066ff}{ 题目描述 }\) 你的任务是制定出一个产品的分配方案,使得订单条件被满足,并且所有员工的愤怒值之和最小.由于我们并不想使用Special Judge,也为了使选手有更多的时间研究其他两道题目,你只需要输出最小的愤怒值之和就可以了. \(\color{#0066ff}{输入格式}\) \(\color{#0066ff}{输出格式}\) 仅输出一个整数,表示最小的愤怒值之和. \(\color{#0066ff}{输入样例}\) 2 3 2 2 2 1 1 0 0

[bzoj2245][SDOI2011]工作安排(费用流)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2245 分析: 要注意到题目下面说的w是单增的 明显的费用流: 弄个源点S,汇点T S连向每种产品,流量是这种产品所需个数,费用是0 每种产品连向能制作它的人,流量为inf,费用是0 每个人向T连Si+1条边,流量t[i][j]-t[i][j-1],费用w[i][j] (因为w是单增的,所以就保证了每个人连向T的Si+1条边肯定是上面的边填满之后再填下面的边,保证了符合题意,如果没有这

BZOJ2245 SDOI2011 工作安排 费用流

题意:有n类产品,其中第i类产品共需要Ci件.有m名员工,员工能够制造的产品种类有所区,一件产品必须完整地由一名员工制造,对于员工i,他的愤怒值与产品数量之间的函数是一个Si+1段的分段函数.当他制造第1~Ti,1件产品时,每件产品会使他的愤怒值增加Wi,1,当他制造第Ti,1+1~Ti,2件产品时,每件产品会使他的愤怒值增加Wi,2……设Ti,0=0,Ti,si+1=+∞,那么当他制造第Ti,j-1+1~Ti,j件产品时,每件产品会使他的愤怒值增加Wi,j, 1≤j≤Si+1.求在订单满足的前

BZOJ 2245 SDOI 2011 工作安排 费用流

题目大意:有一些商品需要被制造,有一些员工,每一个员工会做一些物品,然而这些员工做物品越多,他们的愤怒值越大,这满足一个分段函数.给出哪些员工可以做哪些东西,给出这些分段函数,求最小的愤怒值以满足需要被制造的商品. 思路:费用流.我写的朴素费用流好像很慢,有时间学一学费用流的多路增广. 由于题目中满足那些分段函数是满足单调递增的性质的,所以就可以如下建图: S->每个人,费用0,流量INF 每个商品->T,费用0,流量为需要改商品的数量 对于每个人虚拟建n个节点(n<=5) 每个人-&g

【bzoj1150】[CTSC2007]数据备份Backup 模拟费用流+链表+堆

题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏的乐趣.已知办公楼都位于同一条街上.你决定给这些办公楼配对(两个一组).每一对办公楼可以通过在这两个建筑物之间铺设网络电缆使得它们可以互相备份.然而,网络电缆的费用很高.当地电信公司仅能为你提供 K 条网络电缆,这意味着你仅能为 K 对办公楼(或总计2K个办公楼)安排备份.任一个办公楼都属于唯一的配

【bzoj3280】小R的烦恼 费用流

题目描述 小R最近遇上了大麻烦,他的程序设计挂科了.于是他只好找程设老师求情.善良的程设老师答应不挂他,但是要求小R帮助他一起解决一个难题. 问题是这样的,程设老师最近要进行一项邪恶的实验来证明P=NP,这个实验一共持续n天,第i天需要a[i]个研究生来给他搬砖.研究生毕竟也是人,所以雇佣研究生是需要钱的,机智的程设老师已经联系好了m所大学,第j所大学共有l[j]个研究生,同时雇佣这所大学的一个研究生需要p[j]元钱. 本来程设老师满心欢喜的以为,这样捡最便宜的max{a[i]}个研究生雇来,就

[BZOJ1061] [Noi2008] 志愿者招募 (费用流)

Description 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难 题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完成,其中第i 天至少需要 Ai 个人. 布布通过了解得知,一共有M 类志愿者可以招募.其中第i 类可以从第Si 天工作到第Ti 天,招募费用 是每人Ci 元.新官上任三把火,为了出色地完成自己的工作,布布希望用尽量少的费用招募足够的志愿者,但这 并不是他的特长!于是布布找到了你,希望你帮他设计一种