以前一直写的Dijkstra,快考试了看了眼SPFA,感觉两个代码几乎一模一样?
Dijkstra
dis[s] = 0;
tmp.dis = 0;
tmp.pos = s;
q.push( tmp );
while( !q.empty() )
{
tmp = q.top();
q.pop();
x = tmp.pos;
if( !vis[x] )
{
vis[x] = 1;
for( i = head[x] ; i ; i = a[i].next )
{
y = a[i].to;
if( dis[y] > dis[x] + a[i].dis )
{
dis[y] = dis[x] + a[i].dis;
if( !vis[y] )
{
tmp.dis = dis[y];
tmp.pos = y;
q.push( tmp );
}
}
}
}
}
SPFA
q.push(s);
dis[s]=0;
vis[s]=1;
while(!q.empty())
{
u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u];i;i=h[i].next)
{
v=h[i].to;
if(dis[v]>dis[u]+h[i].w)
{
dis[v]=dis[u]+h[i].w;
if(!vis[v])
{
vis[v]=1;
q.push(v);
}
}
}
}