Dijkstra
void dij(ll s){
for(ll i=1;i<N;i++)dis[i]=1e9;
dis[s]=0;
priority_queue<node>q;
q.push((node){s,0});
while(!q.empty()){
ll u=q.top().id;q.pop();
if(used[u])continue;
used[u]=true;
for(ll i=Last[u];i;i=Next[i]){
ll v=End[i];
if(!used[v] && dis[v]>dis[u]+Len[i]){
dis[v]=dis[u]+Len[i];
q.push((node){v,dis[v]});
}
}
}
}
SPFA
bool SPFA(ll s){
for(ll i=1;i<N;i++)dis[i]=Inf;
queue<ll>q;
dis[s]=0,q.push(s),used[s]=true;
while(!q.empty()){
ll u=q.front();q.pop();
used[u]=false;
for(ll i=Last[u];i;i=Next[i]){
ll v=End[i];ti[i]++;
if(ti[i]>=n)return false;
if(dis[v]>dis[u]+Len[i]){
dis[v]=dis[u]+Len[i];
if(!used[v])q.push(v),used[v]=true;
}
}
}
return true;
}
SPFA优化