spoj 371 Boxes

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=1005;
 8 const int bian=6005;
 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]=0;cos[tot]=-d;nxt[tot]=h[b];h[b]=tot;
18 }
19 bool tell(){
20     memset(v,0,sizeof(v));
21     memset(d,0x3f,sizeof(d));
22     memset(with,0,sizeof(with));
23     memset(minn,0x3f,sizeof(minn));
24     queue<int>q;
25     q.push(S);
26     v[S]=1;
27     d[S]=0;
28     while(!q.empty()){
29         int x=q.front();
30         q.pop();
31         v[x]=0;
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]=1;
40                     q.push(y);
41                 }
42             }
43         }
44     }
45     if(d[T]==0x3f3f3f3f)
46         return 0;
47     return 1;
48 }
49 int zeng(){
50     for(int i=T;i!=S;i=ver[with[i]^1]){
51         val[with[i]]-=minn[T];
52         val[with[i]^1]+=minn[T];
53     }
54     return minn[T]*d[T];
55 }
56 int dinic_cost(){
57     int r=0;
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,0,sizeof(h));
67         memset(nxt,0,sizeof(nxt));
68         tot=1;
69         scanf("%d",&n);
70         S=n+1,T=n+2;
71         for(int i=1;i<=n;i++)
72             scanf("%d",&map[i]);
73         for(int i=1;i<=n;i++){
74             if(map[i]>1)
75                 add(S,i,map[i]-1,0);
76             else if(!map[i])
77                 add(i,T,1,0);
78             add(i,(i==1)?n:i-1,INF,1);
79             add(i,(i==n)?1:i+1,INF,1);
80         }
81         printf("%d\n",dinic_cost());
82     }
83     return 0;
84 }
时间: 2024-10-11 08:36:15

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<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int N=1005,inf=1e9; int T,n,h[N],cnt,ans,d

网络流(进阶)

最大流:DINIC or SAP 最小费用最大流:SPFA+增广(费用的值较离散) or ZKW(费用的值集中) 有源汇的上下界最大流:新建s', t',用(i, j, l, r)表示i到j有一条下界为l上界为r的边,将每条这样的边拆成(s', j, 0, l), (i, t', 0, l), (i, j, 0, r-l),加入边(t, s, 0, max)再从s'到t'求最大流,再去掉(t, s, 0, max)这条边,从s到t求最大流 有源汇的上下界最小可行流:基本同上,将最后一步改成从t到

[转] 一些图论、网络流入门题总结、汇总

最短路问题此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等)http://acm.pku.edu.cn/JudgeOnline/problem?id=2449题意:经典问题:K短路解法:dijkstra+A*(rec),方法很多相关:http://acm.pku.edu.cn/JudgeOnline/showcontest?contest_id=1144该题亦放在搜索推荐题中 POJ 3013 - Big Christmas Tree(基础)http://ac

【转】一些图论、网络流入门题总结、汇总

最短路问题 此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等) http://acm.pku.edu.cn/JudgeOnline/problem?id=2449 题意:经典问题:K短路 解法:dijkstra+A*(rec),方法很多 相关:http://acm.pku.edu.cn/JudgeOnline/showcontest?contest_id=1144 该题亦放在搜索推荐题中 POJ 3013 - Big Christmas Tree(基础) ht

[转载] 一些图论、网络流入门题总结、汇总

转载 最短路问题此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等)http://acm.pku.edu.cn/JudgeOnline/problem?id=2449题意:经典问题:K短路解法:dijkstra+A*(rec),方法很多相关:http://acm.pku.edu.cn/JudgeOnline/showcontest?contest_id=1144该题亦放在搜索推荐题中 POJ 3013 - Big Christmas Tree(基础)http:/

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

POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:http://poj.org/ 1062* 昂贵的聘礼 枚举等级限制+dijkstra 1087* A Plug for UNIX 2分匹配 1094 Sorting It All Out floyd 或 拓扑 1112* Team Them Up! 2分图染色+DP 1125 Stockbroker

图论题目总结(二)(提高版,转载)

如果,我已经做过的题(红色标记),基本都会在本博客写出解体报告.可以自行查找~ 最短路问题 此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等) http://acm.pku.edu.cn/JudgeOnline/problem?id=2449 题意:经典问题:K短路 解法:dijkstra+A*(rec),方法很多 相关:http://acm.pku.edu.cn/JudgeOnline/showcontest?contest_id=1144 该题亦放在搜索推

SPOJ BOXES

给出n个循环位置,每个位置有一定数量的盒子,每次操作可以使一个盒子转移到相邻位置,问最少需要转移多少次使得所有位置上的盒子的数量不会超过1个. 简单题.对于每个位置,加边(s,i,a[i],0),(i,t,1,0).对于相邻的位置加边(i,i+1,inf,1),(i,i-1,inf,1) . 显然最后我们需要求的就是最小费用了. 召唤代码君: #include <iostream> #include <cstring> #include <cstdio> #define

Problem B SPOJ DCEPC11I

Description Vaibhav Sir and Saikat Sir, after completing their graduation, got a job together at a store. Their boss at the store was Sidharth Sir, who was very strict and did not want anyone to have fun at the job. He gave Vaibhav and Saikat sir a v