数据结构与算法-普利姆算法(Prim) | 尚硅谷韩顺平
最小生成树
- 给定一个带权无向连通图,选取一棵树,让树所有边上权的总和最小,叫最小生成树
- N个顶点,一定有N-1条边
- 包含全部顶点
- N-1条边都要在图中
算法介绍
普里姆算法求最小生成树,也就是在包含n个顶点的连通图中,找出只有(n-1)条边所含所有n个顶点的连通子图,也就是所谓的极小连通子图
修路问题:
- 该乡中有7个村庄(A,B,C,D,E,F,G)
- 各个村庄的距离用边数表示(权)比如 A - B 距离5公里
- 问:如何修路保证各个村庄都能联通,并且保证总的修路里程最短?
代码实现
public class PrimAlgorithmm {public static void main(String[] args) {//看看图是否创建成功char[] data = new char[]{'A','B','C','D','E','F','G'};int verxs = data.length;//邻接矩阵用二维数组表示 10000表示两个点不连通int [][]weight=new int[][]{{10000,5,7,10000,10000,10000,2},{5,10000,10000,9,10000,10000,3},{7,10000,10000,10000,8,10000,10000},{10000,9,10000,10000,10000,4,10000},{10000,10000,8,10000,10000,5,4},{10000,10000,10000,4,5,10000,6},{2,3,10000,10000,4,6,10000},};//创建MGraph对象MGragh gragh = new MGragh(verxs);//创建MinTree对象MinTree minTree = new MinTree();minTree.createGraph(gragh,verxs,data,weight);//输出minTree.showGraph(gragh);//测试普利姆minTree.prim(gragh,0);}
}//创建最小生成树
class MinTree{//创建图的邻接矩阵/*** @param gragh 图对象* @param verxs 图对应顶点个数* @param date 图的各个顶点值* @param weight 图的矩阵*/public void createGraph(MGragh gragh,int verxs,char date[],int[][] weight){int i,j;for (i=0;i<verxs;i++){gragh.data[i] = date[i];for (j=0;j<verxs;j++){gragh.weight[i][j] = weight[i][j];}}}//显示图片邻接矩阵public void showGraph(MGragh gragh){for (int[] link:gragh.weight){System.out.println(Arrays.toString(link));}}//编写算法得到最小生成树public void prim(MGragh gragh,int v){//visited[] 标记节点被访问过int visited[]=new int[gragh.verxs];//把当前节点标记为visited[v] = 1;//h1和h2记录两个顶点下标int h1 = -1;int h2 = -1;int minWeight = 10000;//先初始化大数 有比他小的就替换for (int k = 1; k < gragh.verxs ; k++){//每次生成的子图和哪个节点的距离最近for (int i=0;i<gragh.verxs;i++){ //i节点表示被访问过的节点for (int j=0;j<gragh.verxs;j++){ //j节点表示还没访问过的节点if (visited[i]==1 && visited[j] ==0 && gragh.weight[i][j] < minWeight){//替换minWeightminWeight = gragh.weight[i][j];h1 = i;h2 = j;}}}System.out.println("边<"+gragh.data[h1]+","+gragh.data[h2]+">权值:"+minWeight);//当当前节点标记为已经访问visited[h2] = 1;minWeight = 10000;}}
}class MGragh{int verxs; //表示图的节点个数char[] data;//表示节点数据int [][] weight; //存放边 邻接矩阵public MGragh(int verxs){this.verxs = verxs;data = new char[verxs];weight = new int[verxs][verxs];}
}
数据结构与算法-普利姆算法(Prim) | 尚硅谷韩顺平相关推荐
- 数据结构第十二天——普利姆算法和迪杰斯特拉算法
普利姆(Prim)算法求最小生成树,也就是在包含 n个顶点的连通图中,找出只有(n-1)条边包含所有 n个顶点的连通子图,也就是所谓的极小连通子图 最小生成树:给定一个带权的无向连通图,如何选取一棵生 ...
- 最小生成树算法普利姆算法和克鲁斯卡尔算法实现
最小生成树算法: 普里姆算法:顶点集合N,辅助顶点集合S,初始化中,将出发点vi加入S,并从N中删除 1.从顶点集合N中找到一条到集合S最近的边(vi,vj),存储该边,并将vj从N移到S中 2.重复 ...
- 普利姆算法和修路问题
修路问题 看一个应用场景和问题: 有胜利乡有7个村庄(A, B, C, D, E, F, G) ,现在需要修路把7个村庄连通 各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里 问:如何 ...
- 普利姆算法(prim)---(韩顺平数据结构)笔记
普利姆算法 本质:求出从某一结点开始到达其他结点距离花费最少的组合 从图中指定顶点出发,寻找它相连的所有结点,比较这些结点的权值大小,然后连接权值最小的那个结点. 然后将寻找这两个结点相连的所有结点, ...
- 【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序)
最小生成树 什么是最小生成树 是一棵树 - 无回路 - |V|个顶点一定有|V|-1条边 是生成树 - 包含全部顶点 - |V|-1条边全在图里 贪心算法 什么是"贪":每一步都要 ...
- Prim Algorithm(普利姆算法)
Prim算法介绍 普里姆算法(Prim's algorithm),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权 ...
- Java普利姆算法(Prim)与克鲁斯卡尔算法(Kruskal)
1.Java普利姆算法(Prim)与克鲁斯卡尔算法(Kruskal) 普利姆算法(Prim)与克鲁斯卡尔算法(Kruskal)求**最小生成树(极小连通子图)**的算法 1.1普利姆算法(Prim) ...
- 普利姆算法(Prim)
给大家介绍一下普利姆算法, 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (g ...
- 普利姆(prim)算法与迪杰斯特拉(dijestella)算法
一:普利姆(prim)算法 对于临界矩阵表示的图,时间复杂度为O(|V|2) 对于邻接表表示的图,时间复杂度为O(|V|+|E|) 代码: int dist[];//用来记录从原点到各个节点的距离 b ...
最新文章
- ubuntu 搜狗输入法成功安装
- sublime插件调用第三方程序
- [react] React16新特性有哪些?
- Linux系统里如何重装ibus,Linux下安装ibus-rime的方法
- 】.NET使用NPOI组件将数据导出Excel
- freemarker+生成java_Freemarker + xml 实现Java导出word
- Ubuntu10下SSH2协议安装
- TextWatcher实现输入关键字筛选数据
- 如何学习-如何学习数据库
- OSS文件存储方案-阿里云
- python识别图片上的文字_Python程序图片和pdf上文字识别实例
- python打印菱形_python打印菱形
- Gitter+Sidecar制作聊天室
- 基于python的音乐数据分析_基于Python的亚马逊音乐产品评论分析
- Uploadifive上传
- 【微软 Azure 认知服务】零基础搭建微软 Azure AI 认知服务实验分享
- 金蝶云苍穹集成服务云,让企业数据自由流动
- SDRAM芯片中的DQM信号的理解
- Sql 修改表结构的操作
- 苹果一直显示无法连接服务器,苹果6plus无法连接服务器是怎么回事?