SPFA

来源:互联网 发布:最短寻道时间优先算法 编辑:程序博客网 时间:2024/05/17 01:39

SPFA是一种最短路径的算法,它是Ford算法用队列实现,类似于深搜,不断对队列的头以及和它所有连接的点进行松弛操作。

 

SPFA - 区庆亮 - oql

 

所以,一个点可能多次入对。但是,一个点入队的次数不可能超过总点数,假如超过了,就说明有负环。也就是说,一个环的每一条边都是负数,这样,我们只要统计每个点的入队次数,就可以知道是否有负环了。

SPFA - 区庆亮 - oql

 

只要不断进行松弛操作,那么,最终就可以求到目标点到源点的最短路径了。

 

void SPFA(int s,int e)//s为源点,e为目标点
{
 memset(vis,0,sizeof(vis));
 int h=0,t=1,now;
 a[0]=s; vis[s]=1;
 memset(dis,127,sizeof(dis)); dis[s]=0;
 while(h<t)
 {
  now=a[h%100000];
  for(int i=1;i<=m;i++)
  if(f[now][i]!=0)
  {
   if(dis[now]+f[now][i]<dis[i])//松弛操作
   dis[i]=dis[now]+f[now][i];
   if(vis[i]==0)
   {
    vis[i]=1; t++; a[t]=i;
   }
  }
  vis[h]=0;
  h++;
 }
 printf("%d\n",dis[e]);
}


0 0
原创粉丝点击