spoj 371 Boxes
N个盒子围成一圈,第i个盒子初始时有Ai个小球,每次可以把一个小球从一个盒子移到相邻的两个盒子之一里。问最少移动多少次使得每个盒子中小球的个数不超过1。
ΣAi<=N.1<=N<=1000.
最小费用最大流。
每个盒子作为一个点。
若Ai>1则从源点向此点连一条容量为Ai,费用为0的边。
若Ai=0则从此点向汇点连一条容量为1,费用为0的边。
每个盒子向相邻的两个盒子连容量为正无穷,费用为1的边。
最小费用最大流即为答案。
- #include<cstring>
- #include<cstdio>
- #include<iostream>
- #include<algorithm>
- #include<queue>
- using namespace std;
- const int dian=;
- const int bian=;
- const int INF=0x3f3f3f3f;
- int h[dian],nxt[bian],ver[bian],val[bian],cos[bian],with[dian],minn[dian];
- int d[dian],v[dian];
- int map[dian];
- int n,tot;
- int S,T;
- void add(int a,int b,int c,int d){
- tot++;ver[tot]=b;val[tot]=c;cos[tot]=d;nxt[tot]=h[a];h[a]=tot;
- tot++;ver[tot]=a;val[tot]=;cos[tot]=-d;nxt[tot]=h[b];h[b]=tot;
- }
- bool tell(){
- memset(v,,sizeof(v));
- memset(d,0x3f,sizeof(d));
- memset(with,,sizeof(with));
- memset(minn,0x3f,sizeof(minn));
- queue<int>q;
- q.push(S);
- v[S]=;
- d[S]=;
- while(!q.empty()){
- int x=q.front();
- q.pop();
- v[x]=;
- for(int i=h[x];i;i=nxt[i]){
- int y=ver[i];
- if(d[y]>d[x]+cos[i]&&val[i]){
- d[y]=d[x]+cos[i];
- minn[y]=min(minn[x],val[i]);
- with[y]=i;
- if(!v[y]){
- v[y]=;
- q.push(y);
- }
- }
- }
- }
- if(d[T]==0x3f3f3f3f)
- return ;
- return ;
- }
- int zeng(){
- for(int i=T;i!=S;i=ver[with[i]^]){
- val[with[i]]-=minn[T];
- val[with[i]^]+=minn[T];
- }
- return minn[T]*d[T];
- }
- int dinic_cost(){
- int r=;
- while(tell())
- r+=zeng();
- return r;
- }
- int main(){
- int cas;
- scanf("%d",&cas);
- while(cas--){
- memset(h,,sizeof(h));
- memset(nxt,,sizeof(nxt));
- tot=;
- scanf("%d",&n);
- S=n+,T=n+;
- for(int i=;i<=n;i++)
- scanf("%d",&map[i]);
- for(int i=;i<=n;i++){
- if(map[i]>)
- add(S,i,map[i]-,);
- else if(!map[i])
- add(i,T,,);
- add(i,(i==)?n:i-,INF,);
- add(i,(i==n)?:i+,INF,);
- }
- printf("%d\n",dinic_cost());
- }
- return ;
- }
spoj 371 Boxes的更多相关文章
- 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 ...
- [转] POJ图论入门
最短路问题此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等)http://acm.pku.edu.cn/JudgeOnline/problem?id=2449题意: ...
- 图论常用算法之一 POJ图论题集【转载】
POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...
- SPOJ BOXES
给出n个循环位置,每个位置有一定数量的盒子,每次操作可以使一个盒子转移到相邻位置,问最少需要转移多少次使得所有位置上的盒子的数量不会超过1个. 简单题.对于每个位置,加边(s,i,a[i],0),(i ...
- 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 ...
- SPOJ DQUERY D-query(主席树)
题目 Source http://www.spoj.com/problems/DQUERY/en/ Description Given a sequence of n numbers a1, a2, ...
- 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 ...
- Fedora 24 Gnome Boxes 无法ping通网络
安装Fedora 24在试用虚拟机时发现无法ping通外网. 我傻傻地以为是软件问题. 问题描述: 尝试ping程序来测试网络连通性: (我之前也是ping百度,后来在为了少打字百度了一些比较短的域名 ...
- 【填坑向】spoj COT/bzoj2588 Count on a tree
这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...
随机推荐
- Spring 中classPath:用法
参考文章地址: http://hi.baidu.com/huahua035/item/ac8a27a994b55bad29ce9d39 http://blog.csdn.net/lushuaiyin/ ...
- ORA-01950: no privileges on tablespace xxxx
案例场景: 新建了一个表空间后TBS_MARKET_DAT,希望将归档的数据放置在这个表空间. SQL> CREATE TABLESPACE TBS_MARKET_DAT 2 DATAFI ...
- MS SQL专用管理员连接DAC
在SQL SERVER 2005中,微软引入了一个叫做数据库专用管理员连接方式(DAC Dedicated Administrator Connection)的特性,使用这个新特性,数据库管理员可以在 ...
- SQL SERVER 临时表的排序问题
在SQL SERVER 2005/2008中,如果将有序的记录插入临时表,则从临时表查询出来的记录是有序的(不依赖ORDER BY也是有序状态),但是从SQL SERVER 2012开始,即使插入的记 ...
- 一则因为numa引发的mysqldump hang住
新买的dell r430服务器,双CPU,64G内存,单CPU32g,swap 3G 出现故障现像:mysqldump时会hang住,innodb_buffer_pool_size = ...
- android Bundle savedInstanceState用途
经常会出现用户按到home键,退出了界面,或者安卓系统意外回收了应用的进程,这种情况下,使用Bundle savedInstanceState就可以用户再次打开应用的时候恢复的原来的状态 (以下转自: ...
- 【2016-11-7】【坚持学习】【Day22】【C# 委托的应用】
我觉得我对委托的概念还没有完全掌握,于是,我需要继续思考,学习它的应用实现.
- 贪吃蛇(Java实现)
程序效果: 代码: //Snake.java 1 package snake; import javax.swing.*; import java.awt.*; import java.awt.eve ...
- 洛谷练习P2279 P1346
题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状 ...
- 移位操作(>>、<<)
public static void main(String[] args) { /** 移位就是二进制的数往左或右移动,因为接近计算机底层,所以速度比较快 * 8 4 2 1 * * 7 化为二进制 ...