POJ_1275

对差分约束系统还是有点摸不着头脑的感觉,看了别人的分析之后才把代码写了出来。

首先这个题目可以做两个预处理,一个是在输入数据时找出R[i]的最大值,最后的结果一定是大于等于R[i]的,这样在枚举结果时就可以减少一部分工作量。另一个是在输入结束后,可以枚举8个小时的区间,如果这个区间里所有可雇用的人数加起来,还不足区间尾那个时间所需要的工人数,那么这种情况一定是无解的,反之,便一定是有解的。

如果设S[i]为[0,i)这些时间内雇佣的总人数,那么可以列出下面几个差分约束方程:

①S[i+1]-S[i]>=0;

②S[i]-S[i+1]>=-t[i];

③0<=j<=24,i=(j+8)mod24,如果结果i为0,赋i值为24。

当i>j时,S[i]-S[j]>=R[i-1];

当i<j时,S[i]-S[j]>=R[i-1]-sum;

④S[24]-S[0]>=sum。

之后,我们可以枚举sum的值,然后依据上面的四个条件建图,最后判断S[24]的值是否等于sum即可。在用SPFA的时候,还要注意对可能存在负圈的情况作出判断。

#include<stdio.h>#include<string.h>int R[30],d[30],t[30],first[30],next[120],v[120],w[120];int q[900],inq[30],inedq[30];int main(){int i,j,k,N,T,ok,tsum,sum,Rmax,u,e,front,rear;    scanf("%d",&T);while(T--)    {        memset(t,0,sizeof(t));        Rmax=0;for(i=0;i<24;i++)        {            scanf("%d",&R[i]);if(R[i]>Rmax)                Rmax=R[i];        }        scanf("%d",&N);for(i=0;i<N;i++)        {            scanf("%d",&k);            t[k]++;        }        ok=1;for(i=0;i<24;i++)        {            tsum=0;for(j=i,k=0;k<8;j--,k++)            {if(j<0)                    j+=24;                tsum+=t[j];            }if(tsum<R[i])            {                ok=0;break;            }        }if(!ok)        {            printf("No Solution\n");continue;        }for(sum=Rmax;sum<=N;sum++)        {            e=0;            memset(first,-1,sizeof(first));for(i=0;i<24;i++)            {                w[e]=0;                v[e]=i;                next[e]=first[i+1];                first[i+1]=e;                e++;                w[e]=t[i];                v[e]=i+1;                next[e]=first[i];                first[i]=e;                e++;            }for(j=0;j<=24;j++)            {                i=(j+8)%24;if(i==0)                    i=24;if(i>j)                    w[e]=-R[i-1];else                    w[e]=sum-R[i-1];                v[e]=j;                next[e]=first[i];                first[i]=e;                e++;            }            w[e]=sum;            v[e]=24;            next[e]=first[0];            first[0]=e;            e++;for(i=0;i<=24;i++)            {                inq[i]=0;                d[i]=10000;                inedq[i]=0;            }            d[0]=0;            front=rear=0;            q[rear++]=0;            ok=1;while(front<rear)            {                u=q[front++];                inq[u]=0;for(e=first[u];e!=-1;e=next[e])if(d[u]+w[e]<d[v[e]])                    {                        d[v[e]]=d[u]+w[e];if(!inq[v[e]])                        {                            q[rear++]=v[e];                            inq[v[e]]=1;if(++inedq[v[e]]>24)                            {                                d[24]=-1;                                front=rear;break;                            }                        }                    }            }if(d[24]==sum)break;        }        printf("%d\n",sum);    }return 0;    }

  

转载于:https://www.cnblogs.com/staginner/archive/2011/08/15/2138634.html

POJ 1275 Cashier Employment相关推荐

  1. 【POJ - 1275】Cashier Employment(差分约束,建图)

    题干: A supermarket in Tehran is open 24 hours a day every day and needs a number of cashiers to fit i ...

  2. 【差分约束】 HDOJ 1529 Cashier Employment

    引用一下POJ的discuss里的大牛的解释. 详细解释一下. 为避免负数,时间计数1-24.令: R[i] i时间需要的人数 (1<=i<=24) T[i] i时间应聘的人数 (1< ...

  3. 提高篇 第三部分 图论 第4章 差分约束系统

    差分约束系统_我的ACM,我的梦!!!-CSDN博客_差分约束系统 差分约束系统详解 - hr_whisper - 博客园 最短路径算法:Bellman和差分约束系统_算法导论视频课程_其他视频-51 ...

  4. I won't tell you this is about graph theory----zjfc bellman-ford算法与spfa算法

    题目描述 To think of a beautiful problem description is so hard for me that let's just drop them off. :) ...

  5. POJ前面的题目算法思路【转】

    1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...

  6. NOIP 好题推荐(DP+搜索+图论)POJ ZOJ

    NOIP好题推荐(DP+搜索+图论)POJ ZOJ 1370 Gossiping (数论->模线性方程有无解的判断)+(图论->DFS)  1090 Chain ->格雷码和二进制码 ...

  7. POJ 超详细分类

    POJ 各题算法 1000    A+B Problem            送分题     49%    2005-5-7 1001    Exponentiation         高精度   ...

  8. POJ 图论分类 + DP(较全 自己又加了点)

    DP -----------动态规划 状态压缩DP 2411 (棋盘规模较大)状态压缩DP+DFS+滚动数组 2664 (棋盘规模较小)直接递推即可(DP) 2506 (棋盘规模较小)直接递推即可(D ...

  9. ACM比赛经验、刷题记录及模板库总结(更新中)

    前言 本文所提及的部分题目代码,可以在我的Github上找到 第一部分 经验分享及感受 第二部分 刷题记录 一.基础算法&程序语言 //strlen()函数的复杂度是O(n)要小心 //截取字 ...

  10. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

最新文章

  1. Pytorch:transforms的二十二个方法
  2. 解决ubuntu里面的sudo: /etc/sudoers is mode 0640, should be 0440
  3. 龙邱树莓派Raspberry Pi 扩展板电路及其相关实验
  4. python连sql server学生管理系统_Python 跨平台连接 SQL Server
  5. iOS Xcode工程目录的 folder 和 group的区别(蓝色和黄色文件夹的区别)
  6. Fuel 30 分钟快速安装OpenStack
  7. 《Head First 设计模式》专题上线
  8. apicloud代码压缩和全局加密
  9. redis持久化RDB与AOF
  10. 切换进程 切换线程
  11. Python中随机数种子的作用及使用
  12. WSDM-爱奇艺:用户留存预测挑战赛 线上0.865
  13. 【旅游热点】金秋十月 “额济纳胡杨林”登内蒙古景区热度榜首
  14. 用JLINK烧写U-boot到Nand Flash中
  15. MOSFET反向恢复特性总结-4
  16. 基于 Matlab/simulink的锂电池建模与仿真——复现论文《基于二阶EKF的锂离子电池SOC估计的建模与仿真》的仿真部分
  17. 微信硬件蓝牙设备开发之设备解绑(13)
  18. MVPArms Retrofit RxJava实现注册
  19. html页面刷新回到顶部_HTML5 回到顶部
  20. 中国游戏行业市场分析(一)关于国内游戏制作的问题

热门文章

  1. hibernate--生成正向和逆向工程
  2. Make a Crystal UVA - 11014 (容斥定理)
  3. C++虚基类详解(转)
  4. 供参考的 php 学习路线
  5. 知识管理系统Data Solution研发日记之七 源代码与解决方案
  6. Silverlight 功能其全的PDF 控件
  7. thinkphp5 --接口实例
  8. oracle单行函数 之 字符函数
  9. linux常用命令详解(二)
  10. [转载]Badboy使用教程