java Prim算法
来源:互联网 发布:西安市行知中学好不好 编辑:程序博客网 时间:2024/06/11 16:44
先是数据结构定义--邻接表:
//弧的节点结构类型class ANode implements Comparable<ANode>{ int adjVertex; //指向顶点在adjList的下标 ANode nextArc; //指向下一条弧 int value; //存放权值 @Override public int compareTo(ANode o) { // TODO Auto-generated method stub if(this.value>o.value) return 1; else if(this.value<o.value) return -1; else return 0; }}//邻接表节点的类型class VNode{ String name; //顶点信息 ANode firstArc; //指向第一条弧}//图的邻接表类型class ALGraph{ VNode[] adjList; int n; //图的顶点数n int e; //图的边数e public void prim(ALGraph AG,int[] visited,int[] dis){ //visited:数组用于记录顶点是否已加入连通集合 //dis:到已连通集合的最短距离 PriorityQueue<ANode> queue = new PriorityQueue<ANode>(); //优先队列 VNode v = null; ANode e = null; int end; //初始化 for(int i=1;i<=AG.n;i++) dis[i] = 10000; visited[1] = 1; ////将顶点1加入连通集合 System.out.println(AG.adjList[1].name); v = AG.adjList[1]; e = v.firstArc; while(e!=null){ ////处理与顶点1相连的顶点 if(e.value<dis[e.adjVertex]){ dis[e.adjVertex] = e.value; //跟新dis数组 queue.add(e); //将边加入队列 } e = e.nextArc; } while(!queue.isEmpty()){ e = queue.poll(); //取出队列的头元素,即与连通集合距离最小的边 end = e.adjVertex; //边指向的顶点的下标 if(visited[end]==1) //已访问,就跳过 continue; visited[end]=1; System.out.println(AG.adjList[end].name+" ("+e.value+")"); //输出刚刚加入集合的顶点及原来其与集合的最小边权值 v = AG.adjList[end]; e = v.firstArc; while(e!=null){ if(visited[e.adjVertex]==0 && dis[e.adjVertex]>e.value){ //对于集合刚刚加入了一个顶点,遍历它相连的顶点(不在集合的那些)。 //因为与这个顶点不相连的其他顶点,与集合的最小距离也不会变! dis[e.adjVertex] = e.value; queue.add(e); } e = e.nextArc; } } } }
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
然后使用邻接矩阵的数据结构实现:
class Vertex { String name; //顶点信息} class MGraph { int n; //图的顶点数n int e; //图的边数e int[] vex ; //顶点数组 int[][] edges ; //邻接矩阵 public void prim(MGraph MG,int[] visited,int[] dis){ int n = MG.n; for(int i=1;i<=MG.n;i++) dis[i] = 10000; visited[1] = 1; System.out.println(1); for(int i=1;i<=n;i++){ if(MG.edges[1][i]>0){ dis[i] = MG.edges[1][i]; } } int pos = 1; int min; for(int i=2;i<=n;i++){ min = 1000; for(int j=1;j<=n;j++){ if(visited[j]==0 && min>dis[j]) {min = dis[j];pos = j;} } visited[pos] = 1; System.out.println(pos+" ("+dis[pos]+")"); for(int j=1;j<=n;j++){ if(MG.edges[pos][j]>0){ dis[j] = MG.edges[pos][j]; } } } }}
0 0
- java Prim算法
- Java Prim算法
- java实现Prim算法
- prim算法java语言实现
- Prim算法 之 Java详解
- prim算法的java实现
- Prim算法的JAVA实现
- Prim 普里姆算法的java实现
- prim 最小生成树算法 java实现
- Prim算法(三)之 Java详解
- JAVA的最小生成树(prim)算法
- JAVA实践最小生成树-Prim算法
- 普里姆(Prim)算法 Java实现
- 计蒜客-灌溉(java-prim算法)
- prim 算法
- Prim算法
- Prim算法
- prim算法
- zookeeper源码学习(一)
- myeclipse10破解过程
- 闪存读取内存卡,如何去掉写保护
- Android.mk使用笔记
- 备忘读取Excel生成sql
- java Prim算法
- hdoj 1042 N!
- JS控制DOM的CSS样式
- bresenham直线,画圆算法(附OpenGL代码)
- java的五种单例设计模式
- Pangram
- 仿QQ打开“我”界面的滑动效果
- NGUI之UICamera
- C#拾遗之String类(一)