rt,第一篇题解里面那个既用堆又写的跟 spfa 一样的写法照着写下来能过,但是我把它改的和正常 dij 一样就会 WA,有没有神仙看看为啥还是说我脑抽写错了
#include<bits/stdc++.h>
using namespace std;
int n,m,d;
const int N=150100;
int ver[N],ne[N],he[N],speed[N],len[N],tot;
double dis[1010][1010];
bool vis[1010][1010];
void add(int u,int v,int sp,int l){
ver[++tot]=v;
len[tot]=l; speed[tot]=sp;
ne[tot]=he[u];
he[u]=tot;
}
struct node{
int sp,u,t;
bool operator <(const node &a)const{
return t>a.t;
}
}from[1010][1010];
void print(int x,int sp){
if(x==1) return;
print(from[x][sp].u,from[x][sp].sp);
cout<<x-1<<' ';
}
priority_queue<node>q;
void dij(){
q.push({70,1,0});
for(int i=1;i<=n+1;++i)
for(int j=1;j<=1000;++j) dis[i][j]=1e9+10;
dis[1][70]=0;
while(!q.empty()){
node h=q.top(); q.pop();
int last_v=h.sp,u=h.u,t=h.t;
if(vis[u][last_v]) continue; vis[u][last_v]=1;
for(int i=he[u];i;i=ne[i]){
int v=ver[i],now_v=speed[i];
if(now_v){
if(vis[v][now_v]) continue;
if(dis[v][now_v]>dis[u][last_v]+(double)len[i]/(double)now_v){
dis[v][now_v]=dis[u][last_v]+(double)len[i]/(double)now_v;
from[v][now_v].u=u,from[v][now_v].sp=last_v;
// if(vis[v][now_v]) continue; vis[v][now_v]=1;
q.push({now_v,v,dis[v][now_v]});
}
}
else{
now_v=last_v;
if(vis[v][now_v]) continue;
if(dis[v][now_v]>dis[u][last_v]+(double)len[i]/(double)now_v){
dis[v][now_v]=dis[u][last_v]+(double)len[i]/(double)now_v;
from[v][now_v].u=u,from[v][now_v].sp=last_v;
// if(vis[v][now_v]) continue; vis[v][now_v]=1;
q.push({now_v,v,dis[v][now_v]});
}
}
}
}
int id=0; dis[d][id]=1e9+10;
for(int i=1;i<=1000;++i)
if(dis[d][id]>=dis[d][i] && dis[d][i]!=1e9+10) id=i;
cout<<0<<' ';
print(d,id);
// cout<<66;
}
int main(){
cin>>n>>m>>d; ++d;
while(m--){
int u,v,sp,l;
cin>>u>>v>>sp>>l;
add(u+1,v+1,sp,l);
}
dij();
return 0;
}