首页 > 其他分享 >AcWing1170. 排队布局[USACO05]

AcWing1170. 排队布局[USACO05]

时间:2023-01-02 15:01:24浏览次数:37  
标签:USACO05 le AcWing1170 int tt 排队 st add dist

解题思路

\(\qquad\)这题也是一个比较裸的差分约束:多了的那个输出\(-2\)的其实就是在差分约束系统中\(1\)号点和\(n\)号点没有约束关系,也就是\(1\)和\(n\)号不连通。由于这里要求最大距离,所以我们在系统中应该跑最短路

从题目中我们可以看出这样几条约束关系
\(\qquad\quad\) \(\large x_{i+1}\ge x_i\Rightarrow x_i\le x_{i+1}+0\) :因为后面的牛的位置一定不能比前面的靠前。

\(\qquad\quad\)在\(M_L\)条的关系中 \(\large x_b-x_a\le L\Rightarrow x_b\le x_a+L\):距离不大于\(L\)

\(\qquad\quad\)在\(M_D\)条的关系中 \(\large x_b - x_a\ge D\Rightarrow x_a-x_b\le -D\Rightarrow x_a\le x_b-D\):距离不小于\(D\)

然后又没有一个源点可以遍历所有边,所以我们还是建立超级源点\(0\)让它和所有点连边权\(0\)的边。
整理关系得到
\( \Large \left \{ \begin{array}c x_i\le x_{i+1}+0,\\ x_b\le x_a+L,\\ x_a\le x_b-D,\\ x_i\le x_0+0. \end{array} \right. \)

代码

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1010, M = 21010, INF = 0x3f3f3f3f;
int h[N], e[M], w[M], ne[M], idx;
int dist[N], cnt[N], q[N], st[N];
int hh, tt(1), md, ml, n, ring;

void add(int a, int b, int c) 
{
    e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++ ;
}

void spfa(int S) 
{
    memset(dist, 0x3f, sizeof dist);
    memset(st, 0, sizeof st);
    memset(cnt, 0, sizeof cnt);
    
    q[tt ++ ] = S, st[S] = 1, dist[S] = 0;
    
    while (hh != tt) 
    {
        int t = q[hh ++ ];
        if (hh == N) hh = 0;
        st[t] = 0;
        
        for (int i = h[t]; ~i; i = ne[i]) 
        {
            int j = e[i];
            if (dist[j] > dist[t] + w[i]) 
            {
                dist[j] = dist[t] + w[i];
                cnt[j] = cnt[t] + 1;
                if (cnt[j] >= n) return void (ring = true);
                if (!st[j]) 
                {
                    st[j] = true ;
                    q[tt ++ ] = j;
                    if (tt == N) tt = 0;
                }
            }
        }
    }
    
    return void (ring = false);
}

int main() 
{
    scanf("%d%d%d", &n, &ml, &md);
    
    memset(h, -1, sizeof h);
    while (ml -- ) 
    {
        int a, b, l;
        scanf("%d%d%d", &a, &b, &l);
        if (a > b) swap(a, b);
        add(a, b, l);
    }
    
    while (md -- )
    {
        int a, b, d;
        scanf("%d%d%d", &a, &b, &d);
        if (a > b) swap(a, b);
        add(b, a, -d);
    }
    
    for (int i = 1; i < n; i ++ ) 
        add(i + 1, i, 0), add(0, i, 0);
    add(0, n, 0);
    
    spfa(0);
    if (ring) puts("-1");
    else {
        spfa(1);
        printf("%d\n", dist[n] == INF ? -2 : dist[n]);
    }
    
    return 0;
}

标签:USACO05,le,AcWing1170,int,tt,排队,st,add,dist
From: https://www.cnblogs.com/StkOvflow/p/17019911.html

相关文章

  • 分布式排队叫号系统源码出售
    我司开发的分布式排队叫号系统,支持政务大厅、银行、工商、税务等应用场景。1、采用C/S和B/S混合架构,后台采用B/S架构,易于维护2、支持WINDOWS、android系统3、兼容多种LED屏......
  • 还在打印店排队打印文件?足不出户就能在线自助打印的系统
    如果你需要打印一些文件,那么你会选择怎么样的打印方式呢?相信很多人的第一反应就是去周边打印店打印文件,但是现在路边越来越多的打印店消失不见了,即便是找打一家打印店,在遇......
  • R7-1 字符排队
    R7-1字符排队分数 15全屏浏览题目切换布局作者 颜晖单位 浙大城市学院本题要求编写程序,将给定字符串中的字符,按照ASCII码顺序从小到大排......
  • 实践丨GaussDB(DWS)资源管理排队原理与问题定位
    摘要:GaussDB(DWS)提供了资源管理功能,用户可以根据自身业务情况对资源进行划分,将资源按需划分成不同的资源池,不同资源池之间资源互相隔离。本文分享自华为云社区《GaussDB(......
  • 拓端数据|R语言代写如何使用排队论预测等待时间?
    介绍顾名思义,排队论是对用于预测队列长度和等待时间的长等待线的研究。这是一种流行的理论,主要用于运营,零售分析领域。到目前为止,我们已经解决了传入呼叫量和呼叫持续时间事......
  • 基于redis乐观锁实现并发排队 - 基于scrapy运行数量的控制
    有个需求场景是这样的,使用redis控制scrapy运行的数量。当系统的后台设置为4时,只允许scapry启动4个任务,多余的任务则进行排队。概况最近做了一个django+scrapy+celery......
  • ReentrantLock的锁竞争是否排队判断
     publicfinalbooleanhasQueuedPredecessors(){//Thecorrectnessofthisdependsonheadbeinginitialized//beforetailandonhead......
  • 牛客小白月赛61 E.排队(组合数学)
    题目大意:对于n个数,求其所有可能排列中的逆序数之和解题思路:求每种排列逆序数之和,因为数字的顺序在变化,这对我们去计算总和很不利,所以我们转换思路我们可以先考虑数对(a......
  • 排队
    排队$n$个小朋友排成一排,从左到右依次编号为$1\simn$。第$i$个小朋友的身高为$h_i$。虽然队伍已经排好,但是小朋友们对此并不完全满意。对于一个小朋友来说,如果......
  • 从排队上厕所来看线程池的线程分配和处理
      德州站旁边,王二经营一家厕所服务公司,为公众提供便民入厕服务。车站每天人来人往。人越多,自然,王二的生意就越好。王二这里固定提供3间厕所,当超过3人用厕时,后面的人就排队......