`

SPOJ 371 Boxes

阅读更多

题意就是

有一些盒子,放在一个圈上,每个盒子中有若干个球,球的总数不会比盒子的数量多。

现在规定相邻的盒子之间可以把球移动过去,每次可以移动一个球,问用最少的步骤使得每个盒子中的球不超过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;
}


2
0
分享到:
评论

相关推荐

    SPOJ.rar_SPOJ

    《SPOJ在线判题平台:越南版解题攻略》 SPOJ,全称Sphere Online Judge,是一个全球知名的在线编程竞赛平台,旨在提供一个环境让程序员可以测试、提交并评估他们的算法解决方案。这个名为"SPOJ.rar_SPOJ"的压缩包...

    spoj做题表格

    标题:“spoj做题表格”与描述“杨弋SPOJ做题表格”共同指向了在SPOJ(Sphere Online Judge)平台上的编程题目列表,这通常被用于记录和跟踪解决算法问题的进度。SPOJ是一个知名的在线裁判系统,为全球范围内的...

    SPOJ-2.zip_SPOJ_SPOJ-TRIKA.cpp_online judge_sPOJ-Solution_spoj2

    《SPOJ在线判题平台的解题策略与实例解析》 SPOJ(Sphere Online Judge)是一个全球知名的在线编程竞赛平台,它为程序员提供了一个检验自己算法能力的场所。这个名为"SPOJ-2.zip"的压缩包包含了在SPOJ上解决不同...

    spoj 第42题 reverse

    spoj reverse 的solution

    SPOJ极少量的源程序。

    【SPOJ极少量的源程序】这个主题主要涉及到的是编程竞赛平台SPOJ(Sphere Online Judge)上的一些编程挑战。SPOJ是一个在线的编程练习平台,它提供了各种算法和逻辑难题,让程序员通过编写代码来解决。下面将详细...

    SPOJ题库-离线题库-索引+内容+PDF

    SPOJ题库( http://www.spoj.pl)的离线题库。 包括索引+内容。PDF格式。 主要是Classical的problemset。

    SPOJ.zip_SPOJ_sgu_them

    《SPOJ问题解决策略:动态规划的应用》 在编程竞赛和算法研究中,SPOJ(Sphere Online Judge)是一个著名的在线平台,它提供了一系列挑战性的编程问题供参赛者解决。"SPOJ.zip_SPOJ_sgu_them"这个压缩包文件就包含...

    acm pku spoj sgu 经典 图论题解题报告

    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

    标题 "CPP.zip_SPOJ-HOTELS.cpp_circular game spoj_cpp_segment tree_usac" 提到了几个关键元素,包括一个编程挑战(SPOJ-HOTELS)、特定的编程语言(C++)、一种算法(circular game)以及数据结构(segment tree...

    SPOJ:我对 SPOJ 问题的解决方案 (www.spoj.com)

    SPOJ,全称为Sphere Online Judge,是一个在线的编程竞赛平台,它提供了各种算法和数据结构问题供用户解决,以提升编程技能和算法理解。在这个平台上,你可以使用多种编程语言,包括C++,来编写代码并提交解决方案。...

    SPOJ-Solutions:SPOJ算法问题的解决方案

    SPOJ(Sphere Online Judge)是一个在线编程竞赛平台,它提供了大量的算法问题供程序员解决,以提高他们的编程技能和算法理解。"SPOJ Solutions"是这个领域的一个资源集合,包含了解决SPOJ上各种问题的代码示例,...

    cp:一些SPOJ问题的解决方案

    标题 "cp:一些SPOJ问题的解决方案" 暗示了这是一个关于计算机编程,特别是针对SPOJ(Sphere Online Judge)平台上的算法问题解决的资源。SPOJ是一个在线的编程竞赛平台,用户可以在这里提交代码来解决各种算法问题,...

    SPOJ:Python中SPOJ问题的解决方案

    在编程竞赛领域,SPOJ(Sphere Online Judge)是一个广受欢迎的在线判题系统,它提供了大量的编程题目供参赛者解决,以提升算法和编程能力。对于Python爱好者来说,掌握如何在SPOJ上高效地解决问题是至关重要的。...

    SPOJ-BACKUP-TOOL:在 SPOJ 上下载已提交代码的脚本

    SPOJ-备份工具 介绍 在 Sphere Online Judge ( ) 中,您可以尝试所给的具有挑战性的问题。 它还使您能够查看和下载您自己的解决方案。 工具 SPOJ_BACKUP 备份所有已接受的提交并将它们保存在脚本所在的计算机位置。...

    Problem Set 1.zip_FFT simulink_SPOJ

    标题中的"Problem Set 1.zip_FFT simulink_SPOJ"揭示了这是一个关于傅立叶变换(FFT)的项目,具体来说是8点快速傅立叶变换(8-point Fast Fourier Transform),并且它与MATLAB仿真工具Simulink以及在线编程挑战...

    spoj-solutions:简单的SPOJ问题的解决方案。 看

    标题中的"spoj-solutions"指的是Sphere Online Judge (SPOJ) 的解决方案集合。SPOJ是一个在线的编程竞赛平台,它提供了各种算法和数据结构问题供用户解决,以提高编程技能和解决问题的能力。"简单的SPOJ问题的解决...

    spoj4491 莫比乌斯反演

    ### spoj4491 莫比乌斯反演 #### 题目解析 题目要求计算在给定的两个正整数\( n \)和\( m \)范围内,有多少对\((a, b)\)使得它们的最大公约数\(\text{gcd}(a, b) = d\),其中\(d\)为素数,并且\(1 \leq a \leq n\)...

    Ultimate SPOJ Rank Tracker-crx插件

    分机检查spoj用户的排名。 此扩展名有2个选项: - 在选择的比赛中显示用户排名 - 在选择比赛中最多可比较5个用户第一个在后台运行,并在每隔几分钟内更新,您可以设置自己(并默认为15分钟)。当您单击分机的徽标时...

    MSTS.rar_ MSTS-CN_MSTS-CN_SPOJ_msts

    本主题将深入探讨Kruskal算法及其在SPoj(Sphere Online Judge)在线编程平台上的应用。 首先,让我们了解什么是MSTS(Minimum Spanning Tree)。在无向加权图中,MSTS是一棵包括所有顶点的树,其边的权重之和尽...

    sublex.tar.gz_SUBLEX_spoj SUBLEX

    《SUBLEX与后缀自动机在SPOJ平台的应用》 SUBLEX是SPOJ平台上一个关于后缀自动机(Suffix Automaton)的挑战,这个题目旨在考察程序员对后缀自动机的理解以及实现能力。后缀自动机是一种非常重要的字符串处理工具,...

Global site tag (gtag.js) - Google Analytics