题意就是
有一些盒子,放在一个圈上,每个盒子中有若干个球,球的总数不会比盒子的数量多。
现在规定相邻的盒子之间可以把球移动过去,每次可以移动一个球,问用最少的步骤使得每个盒子中的球不超过1个
那么建图还是比较简单
源点跟每个点连接,容量为本来拥有的球数
每个点再与汇点连,容量为1
中间相邻的点之间连边,容量无穷,费用为1
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
#include <map>
#include <set>
#define eps 1e-5
#define MAXN 1111
#define MAXM 55555
#define INF 100000007
using namespace std;
struct EDGE
{
int v, cap, cost, next, re; // re记录逆边的下标。
} edge[MAXM];
int n, m, ans, flow, src, des;
int e, head[MAXN];
int que[MAXN], pre[MAXN], dis[MAXN];
bool vis[MAXN];
void init()
{
e = ans = flow = 0;
memset(head, -1, sizeof(head));
}
void add(int u, int v, int cap, int cost)
{
edge[e].v = v;
edge[e].cap = cap;
edge[e].cost = cost;
edge[e].next = head[u];
edge[e].re = e + 1;
head[u] = e++;
edge[e].v = u;
edge[e].cap = 0;
edge[e].cost = -cost;
edge[e].next = head[v];
edge[e].re = e - 1;
head[v] = e++;
}
bool spfa()
{
int i, h = 0, t = 1;
for(i = 0; i <= n; i ++)
{
dis[i] = INF;
vis[i] = false;
}
dis[src] = 0;
que[0] = src;
vis[src] = true;
while(t != h)
{
int u = que[h++];
h %= n;
vis[u] = false;
for(i = head[u]; i != -1; i = edge[i].next)
{
int v = edge[i].v;
if(edge[i].cap && dis[v] > dis[u] + edge[i].cost)
{
dis[v] = dis[u] + edge[i].cost;
pre[v] = i;
if(!vis[v])
{
vis[v] = true;
que[t++] = v;
t %= n;
}
}
}
}
if(dis[des] == INF) return false;
return true;
}
void end()
{
int u, p, mi = INF;
for(u = des; u != src; u = edge[edge[p].re].v)
{
p = pre[u];
mi = min(mi, edge[p].cap);
}
for(u = des; u != src; u = edge[edge[p].re].v)
{
p = pre[u];
edge[p].cap -= mi;
edge[edge[p].re].cap += mi;
ans += mi * edge[p].cost; // cost记录的为单位流量费用,必须得乘以流量。
}
flow += mi;
}
int nt;
void build()
{
int w;
scanf("%d", &nt);
init();
src = nt + 1;
des = nt + 2;
n = des;
for(int i = 1; i <= nt; i++)
{
scanf("%d", &w);
add(src, i, w, 0);
add(i, des, 1, 0);
}
for(int i = 1; i < nt; i++)
{
add(i, i + 1, INF, 1);
add(i + 1, i, INF, 1);
}
add(1, nt, INF, 1);
add(nt, 1, INF, 1);
}
void MCMF()
{
init();
build();
while(spfa()) end();
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
MCMF();
printf("%d\n", ans);
}
return 0;
}
分享到:
相关推荐
《SPOJ在线判题平台:越南版解题攻略》 SPOJ,全称Sphere Online Judge,是一个全球知名的在线编程竞赛平台,旨在提供一个环境让程序员可以测试、提交并评估他们的算法解决方案。这个名为"SPOJ.rar_SPOJ"的压缩包...
标题:“spoj做题表格”与描述“杨弋SPOJ做题表格”共同指向了在SPOJ(Sphere Online Judge)平台上的编程题目列表,这通常被用于记录和跟踪解决算法问题的进度。SPOJ是一个知名的在线裁判系统,为全球范围内的...
《SPOJ在线判题平台的解题策略与实例解析》 SPOJ(Sphere Online Judge)是一个全球知名的在线编程竞赛平台,它为程序员提供了一个检验自己算法能力的场所。这个名为"SPOJ-2.zip"的压缩包包含了在SPOJ上解决不同...
spoj reverse 的solution
【SPOJ极少量的源程序】这个主题主要涉及到的是编程竞赛平台SPOJ(Sphere Online Judge)上的一些编程挑战。SPOJ是一个在线的编程练习平台,它提供了各种算法和逻辑难题,让程序员通过编写代码来解决。下面将详细...
SPOJ题库( http://www.spoj.pl)的离线题库。 包括索引+内容。PDF格式。 主要是Classical的problemset。
《SPOJ问题解决策略:动态规划的应用》 在编程竞赛和算法研究中,SPOJ(Sphere Online Judge)是一个著名的在线平台,它提供了一系列挑战性的编程问题供参赛者解决。"SPOJ.zip_SPOJ_sgu_them"这个压缩包文件就包含...
hdu 1914稳定婚姻 sgu176 有源汇的上下界 求最小满足的流 poj 2230 递归求欧拉回路 poj 2985 bst模板 poj2723 2-sat验证,二分答案 poj2455 dinic (ek会超时) hdu1689 求最小奇数环 poj2391 isap最快,dinic不减枝...
标题 "CPP.zip_SPOJ-HOTELS.cpp_circular game spoj_cpp_segment tree_usac" 提到了几个关键元素,包括一个编程挑战(SPOJ-HOTELS)、特定的编程语言(C++)、一种算法(circular game)以及数据结构(segment tree...
SPOJ,全称为Sphere Online Judge,是一个在线的编程竞赛平台,它提供了各种算法和数据结构问题供用户解决,以提升编程技能和算法理解。在这个平台上,你可以使用多种编程语言,包括C++,来编写代码并提交解决方案。...
SPOJ(Sphere Online Judge)是一个在线编程竞赛平台,它提供了大量的算法问题供程序员解决,以提高他们的编程技能和算法理解。"SPOJ Solutions"是这个领域的一个资源集合,包含了解决SPOJ上各种问题的代码示例,...
标题 "cp:一些SPOJ问题的解决方案" 暗示了这是一个关于计算机编程,特别是针对SPOJ(Sphere Online Judge)平台上的算法问题解决的资源。SPOJ是一个在线的编程竞赛平台,用户可以在这里提交代码来解决各种算法问题,...
在编程竞赛领域,SPOJ(Sphere Online Judge)是一个广受欢迎的在线判题系统,它提供了大量的编程题目供参赛者解决,以提升算法和编程能力。对于Python爱好者来说,掌握如何在SPOJ上高效地解决问题是至关重要的。...
SPOJ-备份工具 介绍 在 Sphere Online Judge ( ) 中,您可以尝试所给的具有挑战性的问题。 它还使您能够查看和下载您自己的解决方案。 工具 SPOJ_BACKUP 备份所有已接受的提交并将它们保存在脚本所在的计算机位置。...
标题中的"Problem Set 1.zip_FFT simulink_SPOJ"揭示了这是一个关于傅立叶变换(FFT)的项目,具体来说是8点快速傅立叶变换(8-point Fast Fourier Transform),并且它与MATLAB仿真工具Simulink以及在线编程挑战...
标题中的"spoj-solutions"指的是Sphere Online Judge (SPOJ) 的解决方案集合。SPOJ是一个在线的编程竞赛平台,它提供了各种算法和数据结构问题供用户解决,以提高编程技能和解决问题的能力。"简单的SPOJ问题的解决...
### spoj4491 莫比乌斯反演 #### 题目解析 题目要求计算在给定的两个正整数\( n \)和\( m \)范围内,有多少对\((a, b)\)使得它们的最大公约数\(\text{gcd}(a, b) = d\),其中\(d\)为素数,并且\(1 \leq a \leq n\)...
分机检查spoj用户的排名。 此扩展名有2个选项: - 在选择的比赛中显示用户排名 - 在选择比赛中最多可比较5个用户第一个在后台运行,并在每隔几分钟内更新,您可以设置自己(并默认为15分钟)。当您单击分机的徽标时...
本主题将深入探讨Kruskal算法及其在SPoj(Sphere Online Judge)在线编程平台上的应用。 首先,让我们了解什么是MSTS(Minimum Spanning Tree)。在无向加权图中,MSTS是一棵包括所有顶点的树,其边的权重之和尽...
《SUBLEX与后缀自动机在SPOJ平台的应用》 SUBLEX是SPOJ平台上一个关于后缀自动机(Suffix Automaton)的挑战,这个题目旨在考察程序员对后缀自动机的理解以及实现能力。后缀自动机是一种非常重要的字符串处理工具,...