Spfa vs dijkstra
Spfa:vis[]判断的是该点有无入队。
void spfa()
{
q.push(1);
dis[1] = 0;
vis[1] = 1;
while(!q.empty())
{
int u = q.front();
q.pop();
vis[u] = 0;
for(int i = head[u]; i != -1; i = e[i].next)
{
int v = e[i].v;
if(dis[v] > dis[u] + e[i].w)
{
dis[v] = dis[u] + e[i].w;
if(!vis[v])
{
vis[v] = 1;
q.push(v);
}
}
}
}
}
Dijkstra:vis[]判断的是该点有无被松弛过。
void dijkstra()
{
dis[1] = 0;
q.push(make_pair(dis[1],1));
while(!q.empty())
{
int u = q.top().second;
q.pop();
if(vis[u]) continue;
vis[u] = 1;
for(int i = head[u]; i != -1; i = e[i].next)
{
int v = e[i].v;
if(dis[v] > dis[u] + e[i].w)
{
dis[v] = dis[u] + e[i].w;
q.push(make_pair(dis[v],v));
}
}
}
}