N个盒子围成一圈,第i个盒子初始时有Ai个小球,每次可以把一个小球从一个盒子移到相邻的两个盒子之一里。问最少移动多少次使得每个盒子中小球的个数不超过1。

ΣAi<=N.1<=N<=1000.

最小费用最大流。

每个盒子作为一个点。

若Ai>1则从源点向此点连一条容量为Ai,费用为0的边。

若Ai=0则从此点向汇点连一条容量为1,费用为0的边。

每个盒子向相邻的两个盒子连容量为正无穷,费用为1的边。

最小费用最大流即为答案。

  1. #include<cstring>
  2. #include<cstdio>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7. const int dian=;
  8. const int bian=;
  9. const int INF=0x3f3f3f3f;
  10. int h[dian],nxt[bian],ver[bian],val[bian],cos[bian],with[dian],minn[dian];
  11. int d[dian],v[dian];
  12. int map[dian];
  13. int n,tot;
  14. int S,T;
  15. void add(int a,int b,int c,int d){
  16. tot++;ver[tot]=b;val[tot]=c;cos[tot]=d;nxt[tot]=h[a];h[a]=tot;
  17. tot++;ver[tot]=a;val[tot]=;cos[tot]=-d;nxt[tot]=h[b];h[b]=tot;
  18. }
  19. bool tell(){
  20. memset(v,,sizeof(v));
  21. memset(d,0x3f,sizeof(d));
  22. memset(with,,sizeof(with));
  23. memset(minn,0x3f,sizeof(minn));
  24. queue<int>q;
  25. q.push(S);
  26. v[S]=;
  27. d[S]=;
  28. while(!q.empty()){
  29. int x=q.front();
  30. q.pop();
  31. v[x]=;
  32. for(int i=h[x];i;i=nxt[i]){
  33. int y=ver[i];
  34. if(d[y]>d[x]+cos[i]&&val[i]){
  35. d[y]=d[x]+cos[i];
  36. minn[y]=min(minn[x],val[i]);
  37. with[y]=i;
  38. if(!v[y]){
  39. v[y]=;
  40. q.push(y);
  41. }
  42. }
  43. }
  44. }
  45. if(d[T]==0x3f3f3f3f)
  46. return ;
  47. return ;
  48. }
  49. int zeng(){
  50. for(int i=T;i!=S;i=ver[with[i]^]){
  51. val[with[i]]-=minn[T];
  52. val[with[i]^]+=minn[T];
  53. }
  54. return minn[T]*d[T];
  55. }
  56. int dinic_cost(){
  57. int r=;
  58. while(tell())
  59. r+=zeng();
  60. return r;
  61. }
  62. int main(){
  63. int cas;
  64. scanf("%d",&cas);
  65. while(cas--){
  66. memset(h,,sizeof(h));
  67. memset(nxt,,sizeof(nxt));
  68. tot=;
  69. scanf("%d",&n);
  70. S=n+,T=n+;
  71. for(int i=;i<=n;i++)
  72. scanf("%d",&map[i]);
  73. for(int i=;i<=n;i++){
  74. if(map[i]>)
  75. add(S,i,map[i]-,);
  76. else if(!map[i])
  77. add(i,T,,);
  78. add(i,(i==)?n:i-,INF,);
  79. add(i,(i==n)?:i+,INF,);
  80. }
  81. printf("%d\n",dinic_cost());
  82. }
  83. return ;
  84. }

spoj 371 Boxes的更多相关文章

  1. spoj 371 Boxes【最小费用最大流】

    对于ai==0连接(i,t,1,0),对于ai>1(s,i,ai-1,0),然后对以相邻的两个点(i,j)连接(i,j,inf,1),注意这里是一个环的形式,所以1和n+1相连 #include ...

  2. [转] POJ图论入门

    最短路问题此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等)http://acm.pku.edu.cn/JudgeOnline/problem?id=2449题意: ...

  3. 图论常用算法之一 POJ图论题集【转载】

    POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...

  4. SPOJ BOXES

    给出n个循环位置,每个位置有一定数量的盒子,每次操作可以使一个盒子转移到相邻位置,问最少需要转移多少次使得所有位置上的盒子的数量不会超过1个. 简单题.对于每个位置,加边(s,i,a[i],0),(i ...

  5. BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]

    2588: Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MBSubmit: 5217  Solved: 1233 ...

  6. SPOJ DQUERY D-query(主席树)

    题目 Source http://www.spoj.com/problems/DQUERY/en/ Description Given a sequence of n numbers a1, a2, ...

  7. SPOJ GSS3 Can you answer these queries III[线段树]

    SPOJ - GSS3 Can you answer these queries III Description You are given a sequence A of N (N <= 50 ...

  8. Fedora 24 Gnome Boxes 无法ping通网络

    安装Fedora 24在试用虚拟机时发现无法ping通外网. 我傻傻地以为是软件问题. 问题描述: 尝试ping程序来测试网络连通性: (我之前也是ping百度,后来在为了少打字百度了一些比较短的域名 ...

  9. 【填坑向】spoj COT/bzoj2588 Count on a tree

    这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...

随机推荐

  1. Spring 中classPath:用法

    参考文章地址: http://hi.baidu.com/huahua035/item/ac8a27a994b55bad29ce9d39 http://blog.csdn.net/lushuaiyin/ ...

  2. ORA-01950: no privileges on tablespace xxxx

    案例场景: 新建了一个表空间后TBS_MARKET_DAT,希望将归档的数据放置在这个表空间. SQL> CREATE TABLESPACE TBS_MARKET_DAT   2  DATAFI ...

  3. MS SQL专用管理员连接DAC

    在SQL SERVER 2005中,微软引入了一个叫做数据库专用管理员连接方式(DAC Dedicated Administrator Connection)的特性,使用这个新特性,数据库管理员可以在 ...

  4. SQL SERVER 临时表的排序问题

    在SQL SERVER 2005/2008中,如果将有序的记录插入临时表,则从临时表查询出来的记录是有序的(不依赖ORDER BY也是有序状态),但是从SQL SERVER 2012开始,即使插入的记 ...

  5. 一则因为numa引发的mysqldump hang住

    新买的dell r430服务器,双CPU,64G内存,单CPU32g,swap 3G 出现故障现像:mysqldump时会hang住,innodb_buffer_pool_size        = ...

  6. android Bundle savedInstanceState用途

    经常会出现用户按到home键,退出了界面,或者安卓系统意外回收了应用的进程,这种情况下,使用Bundle savedInstanceState就可以用户再次打开应用的时候恢复的原来的状态 (以下转自: ...

  7. 【2016-11-7】【坚持学习】【Day22】【C# 委托的应用】

    我觉得我对委托的概念还没有完全掌握,于是,我需要继续思考,学习它的应用实现.

  8. 贪吃蛇(Java实现)

    程序效果: 代码: //Snake.java 1 package snake; import javax.swing.*; import java.awt.*; import java.awt.eve ...

  9. 洛谷练习P2279 P1346

    题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状 ...

  10. 移位操作(>>、<<)

    public static void main(String[] args) { /** 移位就是二进制的数往左或右移动,因为接近计算机底层,所以速度比较快 * 8 4 2 1 * * 7 化为二进制 ...