站外提求条
  • 板块题目总版
  • 楼主MSX78
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/6/30 19:22
  • 上次更新2025/7/1 14:49:18
查看原帖
站外提求条
564696
MSX78楼主2025/6/30 19:22

LQ 市的交通系统可以看成由 n个结点和 m条有向边组成的有向图。在每条边上有一个信号灯,会不断按 绿黄红黄绿黄红黄... 的顺序循环(初始时刚好变到绿灯)。 当信号灯为绿灯时允许正向通行,红灯时允许反向通行,黄灯时不允许通行。 每条边上的信号灯的三种颜色的持续时长都互相独立,其中黄灯的持续时长等同于走完路径的耗时。 当走到一条边上时,需要观察边上的信号灯,如果允许通行则可以通过此边,在通行过程中不再受信号灯的影响;否则需要等待,直到允许通行。

请问从结点 s 到结点 t 所需的最短时间是多少,如果 无法到达 则输出 -1。


应该是2022蓝桥杯的决赛题 我的代码如下

#include <bits/stdc++.h>
using namespace std;

#define int long long

struct road{
    int to, g, r, d, type;
};

int n, m, s, t;

vector <road> edge[100005]; 

int dis[100005];

void dijkstra(){
    priority_queue<pair<int,int> > q;
    memset(dis,0x7f,sizeof(dis));
    dis[s] = 0;
    q.push({0,s});
    while(!q.empty()){
        int now = q.top().second;
        q.pop();
        for(auto e:edge[now]){
            int nowt = dis[now]%(e.g+e.r+2*e.d);
            int val;
            if(e.type==0){
                if(nowt<e.g){
                    val = e.d;
                }
                else{
                    val = e.g+e.r+2*e.d-nowt+e.d;
                }
                //cout << now << " " << dis[now] << " " << e.to << " " << val << "\n";
                if(dis[e.to]>dis[now]+val){
                    dis[e.to]=dis[now]+val;
                    q.push({dis[e.to],e.to});
                }
            }
            else{
                if(nowt<e.g+e.d){
                    val = e.g+e.d-nowt+e.d;
                }
                else if(nowt<e.g+e.d+e.r){
                    val = e.d;
                }
                else{
                    val = e.g+e.r+2*e.d-nowt+e.g+e.d+e.d;
                }
                //cout << now << " "  << dis[now] << " " << e.to << " " << val << "\n";
                if(dis[e.to]>dis[now]+val){
                    dis[e.to]=dis[now]+val;
                    q.push({dis[e.to],e.to});
                }
            }
        }
    }
}

signed main(){
    cin >> n >> m >> s >> t;
    for(int i = 1;i <= n;i++){
        int u, v, g, r, d;
        cin >> u >> v >> g >> r >> d;
        edge[u].push_back({v,g,r,d,0});
        edge[v].push_back({u,g,r,d,1});
    }
    dijkstra();
    cout << dis[t];
    return 0;
}

求条玄关,谢谢

2025/6/30 19:22
加载中...