查看: 516|回复: 0

单源最短路——Dijkstara算法

[复制链接]

该用户从未签到

发表于 2020-11-20 20:30:44 | 显示全部楼层 |阅读模式
分享到:

算法基本思想:每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径。

  1、将所有的顶点分为两个部分:已知最短路程的顶点集合P和未知最短路径的顶点集合Q

  2、设置源点s到自己的最短路径为0,若存在有源点能够直接到达的顶点i则吧dis设置为e。同时把所有其它不能直接到达的顶点的最短路径设置为∞

  3、在集合Q的所有顶点中选择一个离源点s最近的顶点u即dis最小,加入到集合P。并考察所有以点u为起点地边,对每条边进行松弛操作。

  4、重复第三步,直到集合Q为空,算法结束。最终dis数组中的值就是源点到所有顶点的最短路径。

  1. //dijketra算法
  2. int main()
  3. {
  4.     int e[10][10];
  5.     int book[10];
  6.     int dis[10];
  7.     int i, j, n, m, t1, t2, t3, u, v, min;
  8.     int inf = 99999999;//用inf存储一个我们认为的正无穷值

  9.     //读入n和m;n表示定点个数,m表示边的条数
  10.     scanf("%d%d",&n,&m);

  11.     //初始化e矩阵
  12.     for (i = 1; i <= n; i++)
  13.         for (j = 1; j <= n; j++)
  14.             if (i == j) e[i][j] = 0;
  15.             else e[i][j] == inf;

  16.     // 读入边
  17.             for (i = 1; i <= m; i++)
  18.             {
  19.                 scanf("%d%d%d",&t1,&t2,&t3);
  20.                 e[t1][t2] = t3;
  21.             }
  22.     //初始化dis数组,这里是1号顶点到其余各个顶点的初始路程。
  23.             for (i = 1; i <= n; i++)
  24.                 dis[i] = e[1][i];

  25.     //book数组初始化,book数组用来记录当前点是否被访问,访问1 else0
  26.             for (i = 1; i <= n; i++)
  27.                 book[i] = 0;
  28.             book[1] = 1;//一号顶点标记

  29.     //核心算法
  30.             for (i = 1; i <= n - 1; i++)
  31.             {
  32.                 //找到离一号顶点最近的顶点
  33.                 min = inf;//将最小值复制为无穷
  34.                 for (j = 1; j <= n; j++)
  35.                 {
  36.                     //如果当前顶点没有被访问,并且当前dis数组中的值小于最小值
  37.                     if (book[j] == 0 && dis[j] < min)
  38.                     {
  39.                         min = dis[j];//更新最小值
  40.                         u = j;// 标记当前点
  41.                     }
  42.                 }
  43.                 book[u] = 1;//标记当前点被访问
  44.                 for (v = 1; v <= n; v++)
  45.                 {
  46.                     if (e[u][v] < inf)
  47.                     {
  48.                         //遍历u打头的e数组
  49.                         if (dis[v] > dis[u] + e[u][v])
  50.                             dis[v] = dis[u] + e[u][v];//获得最短路径
  51.                     }
  52.                 }
  53.             }
  54.             //输出结果
  55.             for (i = 1; i <= n; i++)
  56.             {
  57.                 printf("%d\t",dis[i]);
  58.             }
  59.             getchar(); getchar();
  60.     return 0;
  61. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条



手机版|小黑屋|与非网

GMT+8, 2024-5-18 16:14 , Processed in 0.105521 second(s), 15 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.