定义不多说,说说代码的实现。

用落谷上的题目来说明代码的正确性
落谷上的题目

邻接矩阵的实现

定义一个生成树点的集合A,和图中其他点 的集合B
先任意选择一个点a加入到A中,即visit[a]=true;
此时B中的点b到达生成树A的距离为dist[b]=G[a][b](因为此时生成树就一个点a)
然后选择最小的距离加入到A中,即在dist中选择最小的。
之后A中的点变多了,那我们要更新B到A的最新距离。
落谷上显示内存超了。。。。

import java.util.*;class Jademo{public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n=scanner.nextInt();int eNum=scanner.nextInt();int dis[]=new int[n];//dis[i],点i  到生成树的最小距离int num[][]=new int[n][n];boolean visit[]=new boolean[n];for (int i = 0; i < n; i++) {Arrays.fill(num[i], Integer.MAX_VALUE);}for (int i = 0; i <eNum; i++) {int x,y,wei;x=scanner.nextInt();y=scanner.nextInt();wei= scanner.nextInt();x=x-1;y=y-1;if(num[x][y]>wei) {num[x][y] = wei;num[y][x] = wei;}}int s=0;for (int i = 0; i < n; i++) {dis[i]=num[s][i];}visit[s]=true;int ans=0;int index=0;for (int i = 1; i < n; i++) {//遍历所有的点。因为第一次初始化已经有了一个点了、int min=Integer.MAX_VALUE;for (int j = 0; j < n; j++) {//找到最小的dis,即其他点到生成树的最短距离if(dis[j]<min&&!visit[j]){min=dis[j];index=j;}}ans+=min;visit[index]=true;for (int j = 0; j < n; j++) { //生成树里的点变多了,可能有新的点可以到达了。需要更新if(dis[j]>num[index][j]&&!visit[j]){dis[j]=num[index][j];}}}System.out.println(ans);}
}

邻接链表的实现

落谷上显示TLE。。。真是服了。但结果保证正确)

这个实现容易理解,也很容易实现。
在加权无向图中,选择一个起点

  1. 把起点的邻边全部加入到优先队列中。
  2. 取出队列的头部元素,这个边p的权重目前是最小的。
  3. 将这个p对应的顶点w加入到生成树里面
  4. 将w的邻边全部加入到优先队里
  5. 取出头部元素…
package Algorithm.WeightGraph;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;
public class Prime {public static void main(String[] args) {int v,e;Scanner scanner = new Scanner(System.in);v=scanner.nextInt();e=scanner.nextInt();Graph1 graph1 = new Graph1(v,e);for (int i = 0; i < e; i++) {int a;int b;double wei;Edge1 edge1 = new Edge1(a=scanner.nextInt()-1,b=scanner.nextInt()-1,wei=scanner.nextDouble());if(graph1.graph[a][b]!=Double.POSITIVE_INFINITY&&wei>graph1.graph[a][b]){continue;}graph1.addEdge(edge1);}if(!graph1.isConnect()){System.out.println("orz");return;}System.out.println((int)graph1.prime());}}
class Edge1 implements Comparable<Edge1>{int v;int w;double wei;public int compareTo(Edge1 e){if(this.wei<e.wei) return -1;if(this.wei>e.wei) return 1;return 0;}public Edge1(int v,int w,double wei){this.v=v;this.w=w;this.wei=wei;}
}class Graph1{private int v;private int e;double[][] graph;private boolean[] marked;private ArrayList<Edge1> list;//保存生成树的边private PriorityQueue<Edge1> pq;//优先队列public Graph1(int v,int e){this.v=v;this.e=e;graph=new double[v][v];for (int i = 0; i < v; i++) {for (int j = 0; j < v; j++) {graph[i][j]=Double.POSITIVE_INFINITY;}}list=new ArrayList<>();pq=new PriorityQueue<>();marked=new boolean[v];}public Graph1(){}public void addEdge(Edge1 ed){int w=ed.w;int x=ed.v;double wei=ed.wei;graph[w][x]=wei;graph[x][w]=wei;}public double prime(){Arrays.fill(marked,false);double mstWei=0;visit(0);while (!pq.isEmpty()){Edge1 curEdge=pq.poll();if(marked[curEdge.w]&&marked[curEdge.v]) continue;mstWei+=curEdge.wei;if(!marked[curEdge.w]) visit(curEdge.w);if(!marked[curEdge.v]) visit(curEdge.v);list.add(curEdge);}return mstWei;}private void visit(int x){marked[x]=true;for (int i = 0; i <this.v; i++) {if(graph[x][i]!=Double.POSITIVE_INFINITY&&!marked[i]){pq.add(new Edge1(x,i,graph[x][i]));}}}public boolean isConnect(){//图是否连通int count=0;for (int i = 0; i < v; i++) {if(!marked[i]){dfs(i);count++;}}System.out.println(count);return count==1?true:false;//count可作为连通分量的判断。比如count=2,这个图两个连通分量}private void dfs(int v){marked[v]=true;for (int i = 0; i <this.v; i++) {if(!marked[i]&&graph[v][i]!=Double.POSITIVE_INFINITY){dfs(i);}}}
}

小白都能看懂最小生成树prime算法相关推荐

  1. 随机森林的特征 是放回抽样么_机器学习超详细实践攻略(10):随机森林算法详解及小白都能看懂的调参指南...

    一.什么是随机森林 前面我们已经介绍了决策树的基本原理和使用.但是决策树有一个很大的缺陷:因为决策树会非常细致地划分样本,如果决策树分得太多细致,会导致其在训练集上出现过拟合,而如果决策树粗略地划分样 ...

  2. 小白都能看懂的实战教程 手把手教你Python Web全栈开发(DAY 3)

    小白都能看懂的实战教程 手把手教你Python Web全栈开发 Flask(Python Web)实战系列之在线论坛系统 第三讲 这是小白都能看懂的实战教程 手把手教你Python Web全栈开发 的 ...

  3. c语言程序和plc程序的区别,一文告诉你PLC与计算机的本质区别在哪里!小白都能看懂!...

    原标题:一文告诉你PLC与计算机的本质区别在哪里!小白都能看懂! 你真的了解PLC吗?你知道PLC与计算机的本质区别吗?我来简单解释一下吧. 1.PLC可以工作在极其恶劣的电磁环境中 如果我们把计算机 ...

  4. 小白都能看懂的实战教程 手把手教你Python Web全栈开发(DAY 1)

    小白都能看懂的实战教程 手把手教你Python Web全栈开发 Flask(Python Web)实战系列之在线论坛系统 第一讲 博主博客文章内容导航(实时更新) 更多优质文章推荐: 收藏!最详细的P ...

  5. 红色买绿色出 简单易操作的买卖点公式 散户小白都能看懂

    好久没来csdn了,在最初,CSDN是用来记录我做前端写的笔记,后面在工作期间,接触了产品,就转岗了,慢慢的,csdn就很少写了,但是我觉得这里可以作为我记录心得的一个地方,还是挺好的. 因为产品规划 ...

  6. 人人都能看懂的EM算法推导

    作者丨August@知乎(已授权) 来源丨https://zhuanlan.zhihu.com/p/36331115 编辑丨极市平台 估计有很多入门机器学习的同学在看到EM算法的时候会有种种疑惑:EM ...

  7. 兄弟,用大白话告诉你小白都能看懂的Hadoop架构原理

    本文来自:石杉的架构笔记 目录 一.前奏 二.HDFS的NameNode架构原理 一.前奏 Hadoop是目前大数据领域最主流的一套技术体系,包含了多种技术. 包括HDFS(分布式文件系统),YARN ...

  8. em算法 实例 正态分布_人人都能看懂的EM算法推导

    ↑ 点击蓝字 关注极市平台作者丨August@知乎(已授权)来源丨https://zhuanlan.zhihu.com/p/36331115编辑丨极市平台 极市导读 EM算法到底是什么,公式推导怎么去 ...

  9. 争取能让大家都能看懂的 DFA 算法

    为什么要学习这个算法 我们公司一直都有的一个敏感词检测服务,前一段时间遇到了瓶颈,因为词库太多了导致会有一些速度过慢,而且一个正则表达式已经放不下了,需要进行拆分正则才可以. 正好我以前看过有关 df ...

最新文章

  1. 一条路走不通了,就走另一条:
  2. 关于qte illegal instruction的一些心得
  3. Python函数式编程指南
  4. java textfield 数字,如何将整数转换为文本以便在textfield java-blackberry中使用
  5. ABP入门系列(8)——Json格式化
  6. 【转】MyEclipse快捷键大全
  7. 智慧城市排名出炉 拉动安防产业向前进
  8. Python爬虫批量下载糗事百科段子,怀念的天王盖地虎,小鸡炖蘑菇...
  9. html标签--!DOCTYPE (怪异模式和DTD)
  10. 1.oracle dblink(数据库不同实例数据对导)
  11. 物联网卡定位技术涉及范围及工作原理
  12. dts directshow filter_DTS是什么?详解来了
  13. imx 290 支持25fps
  14. js 金额格式化 和 转成人民币大写金额形式
  15. 三代测序数据分析实战
  16. 【NAND文件系统】UBI介绍
  17. 计算机页面下没有桌面图标,电脑下面小图标没了怎么办
  18. 爱的魔力转圈圈-流水灯电路原理详解-PCB系列教程4-1
  19. 一句话理解:过拟合和欠拟合
  20. opencv C++图像/视频旋转 90度 180度 270度

热门文章

  1. 用于RGB-D语义分割的全局-局部传播网络
  2. Rotate Image
  3. https协议原理过程
  4. AI犯错谁之过?切勿盲目相信之
  5. zabbix详细介绍及其自动动态发现
  6. Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager
  7. r语言siggenes包_初探R语言可视化交互式包plotly——旭日图(Sunburst Chart)
  8. 如何自学Python?这本技术大咖推荐Python书籍,就是你的第一选择
  9. java.time不存在_jdk安装成功,但是eclipse打开出现的错误,找不到java runtime
  10. 发条js调试工具_小工具大帮手,利用 @open-node/antman 实现 node.js 进程线上调试,无须重启...