嗯....

 

dijkstra是求最短路的一种算法(废话,思维含量较低,

 

并且时间复杂度较为稳定,为O(n^2),

 

但是注意:!!!!         不能处理边权为负的情况(但SPFA可以处理,今后会讲)

 

借一个何大佬的图,因为会在代码中提到红、绿、空三种颜色,以及小v,

 

通过图会比较清晰一些:

思路大约明白了下面就呈上带批注模板代码:

 #include <cstdio>//dijkstra求最短路
 #include <cstring>
 #include <algorithm>
 using namespace std;
 ;
 int g[maxn][maxn], n, m;//g数组用来存图
 int dis[maxn], status[maxn];//dis数组中存储的是从起点到第i个点的最短路长度 

 /*status//(状态)用来存点的类型,1.已经求出最短路的点(把它想成红色,用2来表示)
 2.是从已经求出最短路的点向外延伸一次就可找到的点(把它想成绿色,用1来表示)
 3.其余还没有访问的,仍没有色(用0来表示)*/ 

 //注意每一种算法都要新开一个函数,使代码简单易懂
 void dijkstra(int start_point) {//dijkstra 最短路写法:
     memset(dis, 0x3f, sizeof(dis));//将dis数组中的每一个元素都设为正无穷,
     //因为后面要用它与更小的最短路进行比较,所以它为最大,且定义为正无穷
     dis[start_point] = ;//确定边界,起点的最短路一定为0
     status[start_point] = ;//起点已求出最短路,首先标记为绿色,进行分析
     ; ti < n; ++ti) //枚举n次
     {
         ;//将小V初始化为-1(小V即为要找的点)
         ; i <= n; ++i) //再次进行枚举
         {
             ) //如果i点为绿色
             {
                  || dis[i] < dis[vertex_to_pick])
                 //如果v还没有被更新或者说是找到一个点i比点v到出发点的距离更近,则也进行更新
                  {
                     vertex_to_pick = i;//进行更新
                 }
             }
         }
         ) {
             break;//如果找不到下一个点,则退出
         }
         status[vertex_to_pick] = ;//将已经更新好的最近的v添加到red集合
         ; i <= n; ++i)
         //从找到的v点进行更新dis数组
         {
              || status[i] == ) //如果i点还没有添加到red集合
             {
                 )// 并且满足从小v这个点到i点有距离
                 {
                     status[i] = ;//再次将i点加入绿色集合,进行循环,找到所有相邻点
                     dis[i] = min(dis[i], dis[vertex_to_pick] + g[vertex_to_pick][i]);//更新i点的最短路
                 }
             }
         }
     }
 }

 int main() {
     //主函数进行输入、调用、输出
     memset(g, -, sizeof(g));
     scanf("%d%d", &n, &m);
     ; i < m; ++i) {
         int u, v, w;
         scanf("%d%d%d", &u, &v, &w);
         g[u][v] = g[v][u] = w;
     }
     dijkstra();
     printf("%d",dis[n]);
     ;
 }

多背几遍应该能明白,   反正一直除了更新就是更新.....

最新文章

  1. 用户反馈:对 Rafy 开发框架的一些个人建议
  2. Go - 字典(map)
  3. 多媒体应用-swift
  4. IIS限制ASP.Net 文件上传大小解决方案,修改IIS7/7.5配置
  5. android - 模拟器连接本地tomcat
  6. github atom 试用
  7. ASP.NET MVC学习之控制器篇扩展性
  8. Hibernate——脏检查和缓存清理机制
  9. 安装可以查看PMM 源码的Go环境
  10. c或c++利用scanf无限输入并进行简单操作如比大小等
  11. Docker(二)搭建和使用Docker
  12. Android多线程的使用
  13. HTML 选择目录
  14. 『PyTorch』第九弹_前馈网络简化写法
  15. SQL 将一个字段内用逗号分隔的内容分成多条记录
  16. bzoj 3059: 归途与征程
  17. 20145234黄斐《java程序设计》第二周
  18. BZOJ 1834 [ZJOI2010]network 网络扩容(费用流)
  19. Afreechart很强大的图表库,支持股票曲线图,饼图,曲线
  20. Hibernate关联映射之_一对多

热门文章

  1. Java自定义分页标签的实现
  2. Execl to HTML
  3. C语言小程序(三)、判断两个日期之差
  4. 无旋Treap - BZOJ1014火星人 &amp; 可持久化版文艺平衡树
  5. HihoCoder1665方块游戏([Offer收割]编程练习赛40)(线段树)
  6. innerdb disable error
  7. Mesos提交任务没有被执行
  8. ECMAScript基本函数、概念区分总结
  9. django基础PROJECT APP View template
  10. Azure自动化部署服务 (1)