1、单源最短路径问题的问题提出是,计算带权有向图G =(V, E)中一个点(源点)到其余各顶点的最短路径长度,如下图所示。设源点为顶点1,采用Dijkstra算法求下图中源V0为到其余各顶点的最短路径。

1)将算法编程实现, 并将程序与运算结果截屏填写入实验结果。

package test;
public class twelve {static float[][] a = {{0,0,0,0,0,0,0},{0,0,3,4,Float.MAX_VALUE,Float.MAX_VALUE,Float.MAX_VALUE},{0,Float.MAX_VALUE,0,1,9,4,Float.MAX_VALUE},{0,Float.MAX_VALUE,Float.MAX_VALUE,0,5,13,Float.MAX_VALUE},{0,Float.MAX_VALUE,Float.MAX_VALUE,Float.MAX_VALUE,0,Float.MAX_VALUE,8},{0,Float.MAX_VALUE,Float.MAX_VALUE,Float.MAX_VALUE,12,0,10},{0,Float.MAX_VALUE,Float.MAX_VALUE,Float.MAX_VALUE,Float.MAX_VALUE,Float.MAX_VALUE,0}};
//  static float[][] a = {//                          {0,0,0,0,0,0},
//                          {0,0,10,Float.MAX_VALUE,30,100},
//                          {0,Float.MAX_VALUE,0,50,Float.MAX_VALUE,Float.MAX_VALUE},
//                          {0,Float.MAX_VALUE,Float.MAX_VALUE,0,Float.MAX_VALUE,10},
//                          {0,Float.MAX_VALUE,Float.MAX_VALUE,20,0,60},
//                          {0,Float.MAX_VALUE,Float.MAX_VALUE,Float.MAX_VALUE,Float.MAX_VALUE,0}
//  };static int n = a.length-1;static float[] dist = new float[n+1];static int[] prev = new int[n+1];public static void main(String[] args) {dijkstra(1,a,dist,prev);show(dist);show(prev);}public static void show(float[] a){for(int i = 2;i < a.length;i++){System.out.print(a[i]+" ");}System.out.println();}public static void show(int[] a){for(int i = 2;i < a.length;i++){System.out.print(a[i]+" ");}System.out.println();}public static void dijkstra(int v/*源点*/, float[][] a/*图G的邻接矩阵*/, float[] dist/*最短特殊路径长度*/, int[] prev/*从源点到顶点u到最短路径中顶点u的前一个顶点*/){if(v<1||v>n) return;//参数不合规范则直接结束boolean[] s = new boolean[n+1];//标记是否加入到集合Sfor(int i = 1;i <= n;i++)//初始化{dist[i] = a[v][i];s[i] = false;//标记为未加入到集合Sif(dist[i] == Float.MAX_VALUE) prev[i] = 0;//如果距离为无穷大则标记为无通路到达else prev[i] = v;//否则标记前驱节点}dist[v] = 0;s[v] = true;//顶点距离到目前顶点距离为0,并加入到集合Sfor(int i = 1;i < n;i++)//选择路径长最短的点加入到集合S中{float temp = Float.MAX_VALUE;//无穷大int u = v;//for(int j = 1;j <= n;j++)if(!s[j]&&(dist[j]<temp))//如果未加入到集合S且距离为目前dist中最小值{u = j;temp = dist[j];}s[u] = true;//加入到集合S中for(int j = 1;j <= n;j++)if(!s[j]&&(a[u][j]<Float.MAX_VALUE)){float newdist = dist[u] + a[u][j];if(newdist < dist[j]){dist[j] = newdist;//将最短路径长记录到dist表prev[j] = u;}}}}
}

运行结果截图:

2)分析Dijkstra算法的时间复杂性。
由代码可知,两层嵌套的for循环,时间复杂度为O(n²)。
2、设G=(V,E)是连通带权图,如下图所示:

使用Prim算法建立G的最小生成树:
1)将算法编程实现, 将程序与运算结果截屏填入实验结果。

package evelen_24;public class twelve {//  static float[][] c = {//                          {0,0,0,0,0,0,0},
//                          {0,0,6,1,5,Float.MAX_VALUE,Float.MAX_VALUE},
//                          {0,6,0,5,Float.MAX_VALUE,3,Float.MAX_VALUE},
//                          {0,1,5,0,5,6,4},
//                          {0,5,Float.MAX_VALUE,5,0,Float.MAX_VALUE,2},
//                          {0,Float.MAX_VALUE,3,6,Float.MAX_VALUE,0,6},
//                          {0,Float.MAX_VALUE,Float.MAX_VALUE,4,2,6,0}
//  };static float[][] c = {{0,0,0,0,0,0,0},{0,0,34,Float.MAX_VALUE,Float.MAX_VALUE,12,Float.MAX_VALUE},{0,34,0,46,Float.MAX_VALUE,Float.MAX_VALUE,19},{0,Float.MAX_VALUE,46,0,17,Float.MAX_VALUE,25},{0,Float.MAX_VALUE,Float.MAX_VALUE,17,0,38,25},{0,12,Float.MAX_VALUE,Float.MAX_VALUE,38,0,26},{0,Float.MAX_VALUE,19,25,25,26,0}
};static int n = c.length-1;public static void main(String[] args) {prim(n, c);}public static void prim(int n,float[][] c/*边的权,邻接矩阵*/){float[] lowcost = new float[n+1];//记录顶点集合V-S中的顶点j到顶点集合S的距离int[] closest = new int[n+1];//记录集合S中离顶点j最近的顶点boolean[] s = new boolean[n+1];//标记是否加入到集合S中s[1] = true;for(int i = 2;i <= n;i++)//初始化{lowcost[i] = c[1][i];closest[i] = 1;s[i] = false;}for(int i = 1;i <= n;i++)//更新表中值{float min = Float.MAX_VALUE;//无穷大int j = 1;for(int k = 2;k <= n;k++)if((lowcost[k] < min)&& (!s[k])){min = lowcost[k];j = k;}
//          System.out.println(j+" , "+closest[j]);s[j] = true;for(int k = 2;k <= n;k++)if((c[j][k] < lowcost[k])&&(!s[k]))//未加入到集合S中且距离更短{lowcost[k] = c[j][k];closest[k] = j;//前驱结点更新}}show(lowcost);show(closest);}public static void show(float[] a){for(int i = 2;i < a.length;i++){System.out.print(a[i]+" ");}System.out.println();}public static void show(int[] a){for(int i = 2;i < a.length;i++){System.out.print(a[i]+" ");}System.out.println();}
}

运行结果截图:

2)分析算法的时间复杂性。
由代码可知,两层嵌套的for循环,时间复杂度为O(n²)

来自《算法基础与实验》

【算法设计与分析】贪心算法:单源最短路径和prim算法的最小生成树相关推荐

  1. 算法百题斩其三: 单源最短路与算法——其一

    算法百题斩其三: 单源最短路与算法--其一 写在前面:何所谓"斩"? 斩,即快速而有力地切断,指我们用最精简的语言,一针见血地点破算法题的核心难点.斩需三思而后行:斩需借助外力.旁 ...

  2. 图的单源最短路径:Dijkstra算法实现

    本文介绍的是图的非负权值的单源最短路径问题.问题的提出是,对于有权图D,t提供源点v,要找到从v到其他所有点的最短路径,即单源最短路径问题,在本文中,解决这一问题,是普遍比较熟悉的Dijkstra算法 ...

  3. dijkstra算法PHP,单源最短路径(dijkstra算法)php实现

    做一个医学项目,其中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路如下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么(Vi ...

  4. matlab结束外循环,求单源最短路径的BellmanFord算法的matlab实现及其优化

    function [minD,path] = BellmanFord(w,start,terminal) %求单源最短路径的Bellman-Ford算法(图论) %调用格式:[minD,path] = ...

  5. 算法设计与分析(电子科技大学)(上)算法基础和贪心算法

    算法分析与设计 引论 (1)理解算法和程序的差别 (2)理解判断问题和优化问题这两类计算问题 1.理解指数增长的规模 2.理解渐进表达式 掌握渐进符号Ο.Θ.Ω的含义,能判断一个函数属于哪个渐近增长阶 ...

  6. JAVA编程求单源最短路径_【算法】单源最短路径——dijkstra算法

    一,概念 单源最短路径 给定一个带权有向图G=(V,E),其中每条边的权是一个实数.另外,还给定V中的一个顶点,称为源.要计算从源到其他所有各顶点的最短路径长度.这里的长度就是指路上各边权之和.这个问 ...

  7. C语言基本数据结构之三(图的广度及深度遍历,求单源最短路径的Dijkstra算法)

    上一篇主要讲了二叉树的先序,中序,后序遍历算法以及深度和节点的算法,这篇就讲一讲图的基本算法. 一.图的基本概念 1.1有向图G1: 有向图G是由两个集合V(G)和E(G)组成的,其中:V(G)是顶点 ...

  8. 图的单源最短路径(Dijkstra算法)

    单源最短路径问题 如果从图中某一顶点(源点)到达另一顶点(终点)的路径可能不止一条,如何找到一条路径使得沿此路径各边上的权值总和达到最小. Dijkstra算法由来 迪杰斯特拉算法(Dijkstra) ...

  9. c语言单源最短路径问题实验报告,单源最短路径问题Dijkstra算法的c语言实现

    求单源最短路径是图论中比较基本的问题,通常的Dijkstra算法是按阶段进行的,每个节点标有处理和未处理状态的标记,设立一个数组,每个数组中第i个元素为源节点到第i个节点的最短路径(当然,该数组的初值 ...

最新文章

  1. 蓦然回首,灯火阑珊的CIO之路(连载八)
  2. 设置VMWARE通过桥接方式使用主机无线网卡上网
  3. lyGrid列表格式化日期
  4. OpenCV相机位移引起的单应性的实例(附完整代码)
  5. Spring Cloud Config入门(本地配置)
  6. redis集群报Jedis does not support password protected Redis Cluster configurations异常解决办法...
  7. windows mysql is read only_mysql中Table is read only错误解决方法(转载)
  8. python如何输出结果为16_python 以16进制打印输出的方法
  9. C#使用SmtpClient发送邮件解决授权码配置问题
  10. 用WPF+MongoDB开发房产信息收集器(4)——房产信息采集器总体介绍附程序下载
  11. 求反关系运算符:“服从分布”的符号表示 与 “不服从分布”的符号表示
  12. PostgreSQL ALTER TABLE中改变数据类型时USING的用法转
  13. 人脸对齐(八)--LBF算法
  14. HDU - 5950 Recursive sequence(矩阵快速幂)
  15. 物联网计算机控制技术,远距离物联网控制系统技术,你知道几个?
  16. GCN学习:用PyG实现自定义layers的GCN网络及训练(五)
  17. App应用最有效的变现方式,还能同时提升留存!
  18. 在img的图片上添加文字
  19. Excel把符合条件的数据全部提取出来
  20. 关于一种新的空气内新冠病毒检测方式的诸多设想

热门文章

  1. ios上webview与浏览器webview
  2. 全球与中国工业级氟化氢铵市场现状及未来发展趋势2022
  3. Windows10 1607版本锁屏聚焦黑屏问题解决办法
  4. 使用C++枚举WINDOWS计划任务-使用管理员启动获取全计划任务,否则获取部分计划任务
  5. addEventlistener()方法,事件监听
  6. 6174C语言编程,C语言代码实现:6174数学黑洞(卡普雷卡尔常数)
  7. 不止ChatGPT,谷歌云 AI 方案早已厉兵秣马!
  8. 天空之城(献给我喜欢的女孩,杨)
  9. java中的finalize
  10. os.system和os.popen和commands