蓝桥杯 交通信号 2022研究生组

news2024/12/24 21:51:08

问题:
在这里插入图片描述

Dijstra算法变形题,有向边分正行和逆行方向,注意逆行的绿灯时间是正行的红灯时间
这题的关键是理清从当前节点出发,到下一个节点是哪一时刻,理清这一点后,再跑Dijstra算法求最短路。
假设curr_t时刻到达u节点,到达邻居v的时刻为nei_t
无论是正行还是逆行,红绿灯的周期T = g + y + r + y,因此curr_t时刻红绿灯的状态等价于p=curr_t%T 时刻的状态
根据p(即红绿灯的状态)分类讨论:

1.走正行道,绿黄红黄顺序等红绿灯, g y r y :

①:p < g, 到达邻居的时间nei_t = curr_t + y,即当前时间加上到达邻居节点的时间y(也是黄灯时间)
②:p >= g, 到达邻居的时间nei_t = curr_t + (g + r + y + y - p) + y,(g + r + y + y - p)为等待绿灯的时间

2.走逆行道,红黄绿黄顺序等红绿灯, r y g y:

①:p < r + y,到达邻居的时间nei_t = curr_t + (r + y - p) + y,(r + y - p)是等绿灯的时间
②:p>=r+y && p < r + y + g, 到达邻居的时间nei_t = curr_t + y,无需等待绿灯
③:p>=r+y+g:到达邻居的时间nei_t = curr_t + (r + y + g + y - p + r + y) + y,
情况③比较特殊,需要等待当前周期结束(即r + y + g + y - p),再等下一个周期的红灯和黄灯(r + y)

#include <iostream>
#include <bits/stdc++.h>
#define ll long long int
using namespace std;
const int MAX = 100010;
struct Edge {
  // dir为true表示正行
  int to, ne, g, r, y;
  bool dir;
  Edge() {}
  Edge(int to, int ne, int g, int r, int y, bool dir) : to(to), ne(ne), g(g), r(r), y(y), dir(dir) {}
} e[3000000];

struct Node {
  int n;
  ll t;
  Node(int n, ll t) : n(n), t(t) {}
  bool operator < (const Node &n1) const {
    return t > n1.t;
  }
};

int cnt = 1;
int h[MAX] = {0};
void add(int u, int v, int g, int r, int y, bool dir) {
  e[cnt].ne = h[u];
  e[cnt].to = v;
  e[cnt].g = g;
  e[cnt].r = r;
  e[cnt].y = y;
  e[cnt].dir = dir;
  h[u] = cnt++;
}

int f[MAX];
int find(int x) {
  return x == f[x] ? f[x] : (f[x] = find(f[x]));
}

int main()
{
  // 请在此输入您的代码
  int n, m, src, tar;
  int u, v, g, r, d;
  cin >> n >> m >> src >> tar;
  ll t[MAX] = {0};
  for(int i = 0; i < MAX; i++) {
    f[i] = i;
    t[i] = 0x1fffffffffffffff;
  }
  for(int i = 0; i < m; i++) {
    scanf("%d %d %d %d %d", &u, &v, &g, &r, &d);
    add(u, v, g, r, d, true);
    // 逆行的绿灯时间是正行的红灯时间
    add(v, u, r, g, d, false);
    int fx = find(u);
    int fy = find(v);
    if(fx != fy) f[fx] = fy;
  }
  if(find(src) != find(tar)) {
    cout << -1;
    return 0;
  }

  priority_queue<Node, vector<Node>> pq;
  t[src] = 0;
  pq.push({src, 0});
  while(!pq.empty()) {
    int curr = pq.top().n;
    ll curr_t = pq.top().t;
    pq.pop();
    if(curr == tar) {
      cout << curr_t;
      return 0;
    }
    for(int edge = h[curr]; edge; edge = e[edge].ne) {
      bool dir = e[edge].dir;
      int to = e[edge].to;
      ll g = e[edge].g;
      ll r = e[edge].r;
      ll y = e[edge].y;
      ll nei_t;
      ll p = curr_t % (g + r + y + y);
      if(dir) {
        // 走正行道,绿黄红黄顺序等红绿灯, g  y  r  y
        nei_t = p < g ? (curr_t + y) : (curr_t + g + r + y + y - p + y);
      } else {
        // 走逆行道,红黄绿黄顺序等红绿灯      r  y  g  y
        if(p < r + y)          nei_t = curr_t + r + y - p + y;
        else if(p < r + y + g) nei_t = curr_t + y;
        else                   nei_t = curr_t + r + y + g + y - p + r + y + y;
      }
      if(nei_t < t[to]) {
        t[to] = nei_t;
        pq.push({to, nei_t});
      }
    }
  }
  return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1579486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STC89C52学习笔记(三)

STC89C52学习笔记&#xff08;三&#xff09; 综述&#xff1a;本文讲述了通过51单片机控制LED闪烁、流水灯、按键控制LED亮灭、按键控制LED实现二进制、按键控制LED左右移。 一、LED 1.LED闪烁 1&#xff09;LED电路原理 LED采用共阳极&#xff0c;当LED另一端为低电平时…

【CSDN活动】人工智能:前沿科技中的创业机遇与挑战

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 人工智能&#xff1a;前沿科技中的创业机遇与挑战一、AI技术的快速发展与应用拓…

KaiwuDB 乱序数据处理功能解读

01 背景一览 在时序数据写入数据库的场景中&#xff0c;由于存在网络延迟等问题&#xff0c;可能会出现需要写入数据的时间戳小于已写入数据的最大时间戳的情况&#xff0c;这类数据统称为乱序数据。乱序数据的产生几乎是不可避免的&#xff0c;同时&#xff0c;乱序数据的写入…

从概念到实践:揭开枚举与联合体在数字化创新时代的神秘面纱

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 在编程的世界中&#xff0c;枚举和联合体是两种非常基础且重要的数据结构。它们各自具有独特的特点和用途&#xff0c;为程序员提供…

Android Studio中查看和修改project的编译jdk版本

android studio中查看和修改project的编译jdk版本操作如下&#xff1a; File->settings->Build,Execution,deployment->Build Tools->Gradles 进入Gradles页面可以查看并修改project的编译jdk版本&#xff0c;如图所示

Open CASCADE学习|平面上的PCurve

曲面上的曲线PCurve&#xff0c;字面上理解即为参数曲线(Parametric Curve)。在几何建模中&#xff0c;PCurve通常被描述为附加在参数曲面之间公共边上的数据结构。从更具体的定义来看&#xff0c;当给定一个曲面方程&#xff0c;并且其参数u和v是另一个参数t的函数时&#xff…

企业微信认证后可以修改主体吗?

企业微信变更主体有什么作用&#xff1f;如果原有的公司注销了&#xff0c;或者要更换一家公司主体来运营企业微信&#xff0c;那么就可以进行变更主体&#xff0c;变更主体后才可以保留原来企业微信上的所有用户&#xff0c;否则就只能重新申请重新积累用户了。企业微信变更主…

SQLite数据库文件格式(十五)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite 4.9的虚拟表机制(十四) 下一篇&#xff1a;SQLite—系列文章目录 ► 目录 本文档描述和定义磁盘上的数据库文件 自 SQLite 以来所有版本使用的格式 版本 3.0.0 &#xff08;2004-06-18&#xff09;. 1. 数据库文件 …

高级Java开发工程师手把手教你用AI人工智能帮你写JAVA代码实际案例一全网唯一

高级Java开发工程师手把手教你用AI人工智能帮你写Java代码实际案例一 一、前言 现在AI人工智能概念炒的很火&#xff0c;人们到处听到的讯息是AI人工智能颠覆我们的生活&#xff0c;或者是代替什么岗位&#xff0c;但是到底AI能帮助到我们什么&#xff0c;能给我们生活带来什…

总结SQL相对常用的几个字符函数

目录 字符的截取 substr() trim()、ltrim()、rtrim() 字符串的拼接 ||、 字符的大小写转换 upper(column_name):大写 lower(column_name):小写 字符替换 replace() 搜索字符 instr(column_name, substring_to_find,start,n_appearence) charindex(substring_to_fi…

基于SSM框架JAVA仓库管理系统源代码Mysql数据库(可当毕设,实训项目,设计大赛)

仓库管理系统实现的功能包括店铺管理&#xff0c;员工管理&#xff0c;部门管理&#xff0c;商品管理&#xff0c;权限管理&#xff0c;入库管理&#xff0c;出库管理&#xff0c;盘点管理&#xff0c;统计管理等功能。该项目采用了Mysql数据库&#xff0c;Java语言&#xff0c…

龙蜥社区「人人都可以参与开源」一次奇妙的开源之旅

前言: 3月17日&#xff0c;马斯克宣布开源Grok-1&#xff0c;这一举措使Grok-1成为当前参数量最大的开源大语言模型&#xff0c;拥有3140亿参数&#xff0c;远超OpenAI GPT-3.5的1750亿。 开源可促进技术高质量发展&#xff0c;让技术迭代更快&#xff0c;更能适应各行各业的发…

学习操作系统之多道批处理系统

1964年IBM生产了第一台小规模集成电路计算机IBM System/360&#xff08;第三代计算机&#xff09;&#xff0c;并为该计算机开发了OS/360操作系统&#xff0c;是第一个多道批处理系统。 多道批处理的运行机制&#xff1a; 多道批处理系统同样要求事先将多道作业存放到外存上并…

无人机倾斜摄影技术在智慧城市中的应用

随着智慧城市的不断发展和完善&#xff0c;新兴热门技术也不断崛起。无人机技术作为其中之一&#xff0c;具有操作简单、应用灵活等优势&#xff0c;受到了各个行业的青睐。现阶段&#xff0c;无人机技术与5G移动通信系统、人工智能系统深度融合&#xff0c;实现了无人机技术的…

优卡达节能科技给您解读2024第13届生物发酵展

参展企业介绍 苏州优卡达节能科技有限公司位于江苏省苏州市相城区&#xff0c;它脱胎于苏州化工机械厂&#xff0c;是专一技术研发生产螺旋板式换热器的厂家。广泛应用于冶金、焦化、纺织、医药、食品、机械、电力、环保、暖通节能及需要热量转换等工业。 公司具有具有多名研…

IRIS / Chronicles 数据结构备忘录

数据结构的内容主要涉及到索引和全局变量。 这部分的内容的问题在于概念多&#xff0c;和普通的数据库对应的内容也不太一样&#xff0c;需要花点时间了解。 networked items 有关英文的解释是&#xff1a; Networked items that point to databases that use padded-string…

LeetCode-移除元素

题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长…

【Java】Java中类的初始化顺序(静态方法,静态块,非静态块,最后有流程图)

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 在日常使用Java的时候&#xff0c;我们都接触过new这个关键字&#xff0c;那你是否知道在我们的对象真正创建出来之前都做了哪些事情呢&#xff1f; 实际上要去判断一个类的初始化的顺序&#xff0c;需要分一下情况&…

《C++程序设计》阅读笔记【6--类(1)】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;《C程序设计》阅读笔记 本文对应的PDF源文件请关注微信公众号程序员刘同学&#xff0c;回复C程序设计获取下载链接。 1 类1.1 概述1.2 构造函数1.3 析构函数1.4 重载构造函数 2 总结 1 类…

谷歌建站用什么程序比较好?

建网站这回事&#xff0c;说容易也容易&#xff0c;现如今市面上建站的程序多如牛毛&#xff0c;哪怕你不会代码也能建一个漂亮的网站&#xff0c;但网站搭建出来是为了什么&#xff1f;是为了获取流量&#xff0c;拉到业务&#xff0c;那么&#xff0c;建站的时候你就要考虑谷…