acwing-1170. 排队布局(差分约束)[通俗易懂]

acwing-1170. 排队布局(差分约束)[通俗易懂]当排队等候喂食时,奶牛喜欢和它们的朋友站得靠近些。农夫约翰有 N 头奶牛,编号从 1 到 N,沿一条直线站着等候喂食。奶牛排在队伍中的顺序和它们的编号是相同的。因为奶牛相当苗条,所以可能有两头或者更多奶牛站在同一位置上。如果我们想象奶牛是站在一条数轴上的话,允许有两头或更多奶牛拥有相同的横坐标。一些奶牛相互间存有好感,它们希望两者之间的距离不超过一个给定的数 L。另一方面,一些奶牛相互间非常反感,它们希望两者间的距离不小于一个给定的数 D。给出 ML 条关于两头奶牛间有好感的描述,再给出 MD


Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

当排队等候喂食时,奶牛喜欢和它们的朋友站得靠近些。

农夫约翰有 N 头奶牛,编号从 1 到 N,沿一条直线站着等候喂食。

奶牛排在队伍中的顺序和它们的编号是相同的。

因为奶牛相当苗条,所以可能有两头或者更多奶牛站在同一位置上。

如果我们想象奶牛是站在一条数轴上的话,允许有两头或更多奶牛拥有相同的横坐标。

一些奶牛相互间存有好感,它们希望两者之间的距离不超过一个给定的数 L。

另一方面,一些奶牛相互间非常反感,它们希望两者间的距离不小于一个给定的数 D。

给出 ML 条关于两头奶牛间有好感的描述,再给出 MD 条关于两头奶牛间存有反感的描述。

你的工作是:如果不存在满足要求的方案,输出-1;如果 1 号奶牛和 N 号奶牛间的距离可以任意大,输出-2;否则,计算出在满足所有要求的情况下,1 号奶牛和 N 号奶牛间可能的最大距离。

输入格式
第一行包含三个整数 N,ML,MD。

接下来 ML 行,每行包含三个正整数 A,B,L,表示奶牛 A 和奶牛 B 至多相隔 L 的距离。

再接下来 MD 行,每行包含三个正整数 A,B,D,表示奶牛 A 和奶牛 B 至少相隔 D 的距离。

输出格式
输出一个整数,如果不存在满足要求的方案,输出-1;如果 1 号奶牛和 N 号奶牛间的距离可以任意大,输出-2;否则,输出在满足所有要求的情况下,1 号奶牛和 N 号奶牛间可能的最大距离。

数据范围
2≤N≤1000,
1≤ML,MD≤104,
1≤L,D≤106

输入样例:
4 2 1
1 3 10
2 4 20
2 3 3
输出样例:
27

差分约束,判断是否存在的时候可以建立一个虚拟源点,判断是否存在正/负环即可。然后固定一个值,跑spfa求最值

#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f3f3f3f3f;
const int N = 1e3 + 10;
const int M = 3e4 + 10;
typedef long long ll;
struct Edge{ 
   
    int v,next,w;
}edge[M];
int head[N],cnt;
void add(int u,int v,int w){ 
   
    edge[cnt].v = v;
    edge[cnt].w = w;
    edge[cnt].next = head[u];
    head[u] = cnt ++;
}
int q[N],hh = 0,tt = 0;
int vis[N];
ll dist[N],c[N];
    int n,ml,md;
ll spfa(int size){ 
   
    hh = tt = 0;
    memset(vis,0,sizeof vis);
    memset(dist,INF,sizeof dist);
    memset(c,0,sizeof c);
    for(int i = 1;i <= size;i ++){ 
   
        q[tt ++] = i,c[i] = 0,dist[i] = 0;
    }
    while(hh < tt){ 
   
        int t = q[ --tt];
        vis[t] = false;
        for(int i = head[t];~i;i = edge[i].next){ 
   
            int v = edge[i].v,w = edge[i].w;
            if(dist[v] > dist[t] + w){ 
   
                dist[v] = dist[t] + w;
                c[v] = c[t] + 1;
                if(c[v] >= n + 1)return -1;
                if(!vis[v]){ 
   
                    vis[v] = true;
                    q[tt ++] = v;
                }
            }
        }
    }
    
    if(dist[n] > INF / 2)return -2;
    return dist[n];
    
}
int main(){ 
   
    cin>>n>>ml>>md;
    memset(head,-1,sizeof head);
    int x,y,d;
    for(int i = 0;i < ml;i ++){ 
   
        cin>>x>>y>>d;
        if(x > y)swap(x,y);
        add(x,y,d);
    }
    for(int i = 0;i < md;i ++){ 
   
        cin>>x>>y>>d;
        if(x > y)swap(y,x);
        add(y,x,-d);
    }
    for(int i = 1;i <= n - 1;i ++){ 
   
        add(i + 1,i,0);
    }
    if(spfa(n) != -1){ 
   
        cout<<spfa(1)<<endl;
    }
    else cout<<-1<<endl;
    return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168578.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C语言中char、short、int、long各占多少字节

    C语言中char、short、int、long各占多少字节1byte=8bit一个字节占8个二进制位windows操作系统,32位机中,char:1个字节short:2个字节int:4个字节long:4个字节以下是windows操作系统,32位机下的代码测试结果(32位机中,指针占4个字节,如变量e):windows操作系统,64位机中,char:1个字节…

    2022年5月5日
  • Java实现完美洗牌算法

    1问题描述有一个长度为2n的数组{a1,a2,a3,…,an,b1,b2,b3,…,bn},希望排序后变成{a1,b1,a2,b2,a3,b3,…,an,bn},请考虑有没有时间复杂度为O(n)而空间复杂度为O(1)的解法。2解决方案2.1位置置换算法下面算法的时间复杂度为O(n),空间复杂度为O(n)。packagecom.liuzhen.practice;publiccl…

    2022年4月7日
  • 列存储中常用的数据压缩算法

    列存储中常用的数据压缩算法列存储,作为一种针对数据查询和数据分析设计的数据存储策略,在“大数据”越来越普及的今天可以说是相当地火热。相较于行存储,列存储的最大优势有二,其一就是查询涉及到数据库的哪几个列就读哪几个列,不读一点与查询不相关的列,大大减少了数据的读取,其二就是数据库数据分为多个独立的列来存储,相同数据类型的数据连续存储在一起,易于数据压缩,而这再次减少了数据的读取。以上正是列存储在处理数据查询和数据分析方面的天

    2022年7月14日
  • 华为超级vlan配置_华为p9参数配置

    华为超级vlan配置_华为p9参数配置本期分享:系列15点到16点半-技术热讯感谢大家关注-最铁头的网工,请大家持续关注就可以了哦!关于进阶级手册在下方↓↓↓众元教育-华为HCIA-HCIE技术认证课:课程通道众元教育-华为HCIA-HCIE技术认证裙:6962831861技术背景了解superVLAN之前,我们想想,如果没有superVLAN是什么样的情况?我们都知道,VLAN技术是用来隔离广播域的,通常,我们都是1个三层IP网段对应一个VLAN,那么问题来了,有的VLAN只需要几个IP,我们却要给它…

    2022年9月19日
  • 重定向是get还是post_请求转发与重定向的异同

    重定向是get还是post_请求转发与重定向的异同一、调用方式 我们知道,在servlet中调用转发、重定向的语句如下:request.getRequestDispatcher(“new.jsp”).forward(request,response);//转发到new.jspresponse.sendRedirect(“new.

    2022年9月8日
  • Ubuntu安装gcc失败的那些事儿「建议收藏」

    Ubuntu安装gcc失败的那些事儿「建议收藏」想在虚拟机上运行一个C程序输入gcc-ohellohello.c编译C语言文件嗯?找不到gcc。。。那就下载gcc输入gcc安装命令sudoaptinstallgcc安装包即将下完的时候提示下载错误,(我滴天,什么人间疾苦!!!)有几个软件包下载不了,还建议我使用sudoapt-getupdate或者加上–fix-missing那就屈尊采纳一下它的建议使用sudoapt-getupdate更新了一下软件资源(然并卵。。。)再试一下sudoaptinstallgc

    2022年7月24日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号