RT.
时间复杂度 O((n+m)logm) 没有问题呀,整个不就是在跑 Dijkstra 吗。为什么要让我超时,呜呜。
就是得卡常吧?我不怎么会卡常,所以发个帖问一下各位巨佬。
提交记录在这里。
代码(虽然提交记录里看得到但还是贴一下吧):
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
struct node{int id;long long tim;};
struct line{int to;long long bus,walk;};
bool operator < (const node &A, const node &B){return A.tim>B.tim;}
vector<line> g[N];priority_queue<node> q;
int T,n,m;long long t0,t1,t2,l,r,ans,dis[N];
long long read(){
long long su=0,pp=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')pp=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){su=su*10+ch-'0';ch=getchar();}
return su*pp;
}
int main(){
T=read();
while(T--){
n=read(),m=read(),t0=read(),t1=read(),t2=read();l=0,r=t0,ans=-1;
for(int i=1;i<=n;i++)g[i].clear(),dis[i]=-1;dis[n]=t0;
for(int i=1;i<=m;i++){
int x=read(),y=read(),k1=read(),k2=read();
g[x].push_back({y,k1,k2}),g[y].push_back({x,k1,k2});
}
while(!q.empty())q.pop();q.push({n,t0});
while(!q.empty()){
auto [u,t]=q.top();q.pop();
for(auto [v,b,w]:g[u]){
if(t<=t1||t-b>=t2){
if(dis[v]>=t-b)continue;
dis[v]=t-b;q.push({v,dis[v]});
}
else{
long long NewDis=(t-w>t1-b?t-w:t1-b);
if(dis[v]>=NewDis)continue;
dis[v]=NewDis;q.push({v,dis[v]});
}
}
}
cout<<dis[1]<<"\n";
}
return 0;
}
麻烦在本帖下回复并 at 我 / 私信,谢谢喵!