【算法设计与分析】贪心算法:单源最短路径和prim算法的最小生成树
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算法的最小生成树相关推荐
- 算法百题斩其三: 单源最短路与算法——其一
算法百题斩其三: 单源最短路与算法--其一 写在前面:何所谓"斩"? 斩,即快速而有力地切断,指我们用最精简的语言,一针见血地点破算法题的核心难点.斩需三思而后行:斩需借助外力.旁 ...
- 图的单源最短路径:Dijkstra算法实现
本文介绍的是图的非负权值的单源最短路径问题.问题的提出是,对于有权图D,t提供源点v,要找到从v到其他所有点的最短路径,即单源最短路径问题,在本文中,解决这一问题,是普遍比较熟悉的Dijkstra算法 ...
- dijkstra算法PHP,单源最短路径(dijkstra算法)php实现
做一个医学项目,其中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路如下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么(Vi ...
- matlab结束外循环,求单源最短路径的BellmanFord算法的matlab实现及其优化
function [minD,path] = BellmanFord(w,start,terminal) %求单源最短路径的Bellman-Ford算法(图论) %调用格式:[minD,path] = ...
- 算法设计与分析(电子科技大学)(上)算法基础和贪心算法
算法分析与设计 引论 (1)理解算法和程序的差别 (2)理解判断问题和优化问题这两类计算问题 1.理解指数增长的规模 2.理解渐进表达式 掌握渐进符号Ο.Θ.Ω的含义,能判断一个函数属于哪个渐近增长阶 ...
- JAVA编程求单源最短路径_【算法】单源最短路径——dijkstra算法
一,概念 单源最短路径 给定一个带权有向图G=(V,E),其中每条边的权是一个实数.另外,还给定V中的一个顶点,称为源.要计算从源到其他所有各顶点的最短路径长度.这里的长度就是指路上各边权之和.这个问 ...
- C语言基本数据结构之三(图的广度及深度遍历,求单源最短路径的Dijkstra算法)
上一篇主要讲了二叉树的先序,中序,后序遍历算法以及深度和节点的算法,这篇就讲一讲图的基本算法. 一.图的基本概念 1.1有向图G1: 有向图G是由两个集合V(G)和E(G)组成的,其中:V(G)是顶点 ...
- 图的单源最短路径(Dijkstra算法)
单源最短路径问题 如果从图中某一顶点(源点)到达另一顶点(终点)的路径可能不止一条,如何找到一条路径使得沿此路径各边上的权值总和达到最小. Dijkstra算法由来 迪杰斯特拉算法(Dijkstra) ...
- c语言单源最短路径问题实验报告,单源最短路径问题Dijkstra算法的c语言实现
求单源最短路径是图论中比较基本的问题,通常的Dijkstra算法是按阶段进行的,每个节点标有处理和未处理状态的标记,设立一个数组,每个数组中第i个元素为源节点到第i个节点的最短路径(当然,该数组的初值 ...
最新文章
- 蓦然回首,灯火阑珊的CIO之路(连载八)
- 设置VMWARE通过桥接方式使用主机无线网卡上网
- lyGrid列表格式化日期
- OpenCV相机位移引起的单应性的实例(附完整代码)
- Spring Cloud Config入门(本地配置)
- redis集群报Jedis does not support password protected Redis Cluster configurations异常解决办法...
- windows mysql is read only_mysql中Table is read only错误解决方法(转载)
- python如何输出结果为16_python 以16进制打印输出的方法
- C#使用SmtpClient发送邮件解决授权码配置问题
- 用WPF+MongoDB开发房产信息收集器(4)——房产信息采集器总体介绍附程序下载
- 求反关系运算符:“服从分布”的符号表示 与 “不服从分布”的符号表示
- PostgreSQL ALTER TABLE中改变数据类型时USING的用法转
- 人脸对齐(八)--LBF算法
- HDU - 5950 Recursive sequence(矩阵快速幂)
- 物联网计算机控制技术,远距离物联网控制系统技术,你知道几个?
- GCN学习:用PyG实现自定义layers的GCN网络及训练(五)
- App应用最有效的变现方式,还能同时提升留存!
- 在img的图片上添加文字
- Excel把符合条件的数据全部提取出来
- 关于一种新的空气内新冠病毒检测方式的诸多设想
热门文章
- ios上webview与浏览器webview
- 全球与中国工业级氟化氢铵市场现状及未来发展趋势2022
- Windows10 1607版本锁屏聚焦黑屏问题解决办法
- 使用C++枚举WINDOWS计划任务-使用管理员启动获取全计划任务,否则获取部分计划任务
- addEventlistener()方法,事件监听
- 6174C语言编程,C语言代码实现:6174数学黑洞(卡普雷卡尔常数)
- 不止ChatGPT,谷歌云 AI 方案早已厉兵秣马!
- 天空之城(献给我喜欢的女孩,杨)
- java中的finalize
- os.system和os.popen和commands