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;
}
求条玄关,谢谢