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、spfaspfa其实是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;}}
阅读全文
0 0
- spfa和广度优先遍历
- 广度优先遍历和深度优先遍历
- 深度优先遍历和广度优先遍历
- 深度优先遍历 和 广度优先遍历
- 深度优先遍历和广度优先遍历
- 深度优先遍历和广度优先遍历
- 深度优先遍历和广度优先遍历
- 深度优先遍历和广度优先遍历
- 深度优先遍历和广度优先遍历
- 深度优先和广度优先遍历迷宫
- 深度优先和广度优先遍历
- 深度优先和广度优先遍历算法
- 图遍历--深度优先和广度优先
- 图的遍历:深度优先遍历和广度优先遍历
- 无向图深度优先遍历和广度优先遍历
- 图论----深度优先遍历和广度优先遍历
- 图论----深度优先遍历和广度优先遍历
- 图的深度优先遍历和广度优先遍历算法
- 杂记
- 进程与线程,信号量与互斥量的区别
- 省选专练SDOI2010所驼门王的宝藏
- 关于Java script 定时器(timer)的一些使用
- 学习记录6
- spfa和广度优先遍历
- 12月9日的学习报告--定时器
- 集群部署时,session缓存问题
- okhttp3简单封装GET和POST请求工具类
- NFS服务的配置与应用
- 最小生成树模版题Prim——修建道路
- 利用json-lib给前台传递json数据
- Servlet实现文件上传的原理
- 编译原理——短语、直接短语、句柄