spfa和广度优先遍历

来源:互联网 发布:2016网络小说知乎50 编辑:程序博客网 时间:2024/05/20 10:12

spfa与广度优先遍历很相似,都需要用到队列,所以一起写。

1、BFS(广度优先遍历)

从一个起点出发,找到所有与这个点相邻的点,将他们都放到队列中,在依次查找。代码如下:

void bfs(int st){memset(q,0,sizeof(q));int head=0,tail=1;q[1]=st;flag[st]=true;while(head<tail){int k=q[++head];for(int j=linkk[k];j;j=a[j].next){if(!flag[a[j].to]){q[++tail]=a[j].to;flag[a[j].to]=true;}}}}
2、spfa

spfa其实是bellman—ford的优化,bellman—ford中列举了太多没用的边,拖慢了许多效率。实际上只有在一个点的最短路被更新过,它才有可能去更新其他边的最短路,所以每次做完迭代后,如果当前的点不在队列中,就把它加到队列中,然后再用它去更新其他点的最短路。代码如下:

void spfa(int st){memset(vis,false,sizeof(vis));memset(dis,10,sizeof(dis));dis[st]=0;vis[st]=true;int head=1,tail=0;q[++tail]=st;while(head<=tail){int tn=q[head];for(int j=linkk[tn];j;j=e[j].next){int temp=e[j].y;if(dis[tn]+e[j].v<dis[temp]){dis[temp]=dis[tn]+e[j].v;if(!vis[temp]){q[++tail]=temp;vis[temp]=true;}}}head++;vis[tn]=false;}}