`

java 图论三 带权图的最小生成树 Prim算法

阅读更多

带权图是实际情况中经常使用的,如城市道路,etl优化等等。

 

在带权图中经常遇到的问题就是生成最小生成树,就是加权总值最小的路径,这里用prime算法实现

 

prim算法的总思路

 

/**
	 * 生成最小生成树
	 * 将顶点放到树集合中,重复一下操作
	 * 1.找到最新的vertex到其他vertex的所有edge,其他vertex不能在树集合中,把这些edge放到优先队列中
	 * 2.找到权值最小的边,把edge和edge所到达的vertex放到树集合中
	 */

 

 

prim算法的过程示意图:这里贴一个邮电大学的

http://resource.jingpinke.com/details?uuid=ff808081-29263667-0129-2636a17d-39cb&objectId=oid:ff808081-29263667-0129-2636a17d-39cc

 

prim算法代码,java实现:

 

 

package com.Construction.DiscrectGraph;

import java.io.ObjectOutputStream.PutField;

public class Graph {
	/**
	 * max vertx number
	 */
	private final int MAX_VERTX = 20;
	/**
	 * max distance value
	 */
	private final int INFINITY  = 1000000;
	/**
	 * node list
	 */
	private Vertex vertexList[];
	/**
	 * adjacency matrix
	 */
	private int adjMat[][];
	/**
	 * graph node number
	 */
	private int nVerts;
	/**
	 * prime tree number
	 */
	private int nTree;
	/**
	 * current tree node
	 */
	private int currentVert;
	
	private PriorityQ priorityQueue;
	
	public Graph(){
		vertexList = new Vertex[MAX_VERTX];
		adjMat = new int[MAX_VERTX][MAX_VERTX];
		nVerts = 0;
		for (int i = 0; i < MAX_VERTX; i++) {
			for (int j = 0; j < MAX_VERTX; j++) {
				adjMat[i][j] = INFINITY;
			}
		}
		priorityQueue = new PriorityQ();
	}
	
	/**
	 * 添加元素
	 * @param label
	 */
	public void addVertex(char label){
		//添加元素,并将计数器加一
		vertexList[nVerts++] = new Vertex(label);
	}
	
	/**
	 * 添加边
	 * @param sv
	 * @param dv
	 * @param dis
	 */
	public void addEdge(int sv,int dv,int dis){
		adjMat[sv][dv] = dis;
		adjMat[dv][sv] = dis;
	}
	
	
	/**
	 * 生成最小生成树
	 * 将顶点放到树集合中,重复一下操作
	 * 1.找到最新的vertex到其他vertex的所有edge,其他vertex不能在树集合中,把这些edge放到优先队列中
	 * 2.找到权值最小的边,把edge和edge所到达的vertex放到树集合中
	 */
	public void mstw(){
		currentVert = 0;
		while (nTree < nVerts -1) {
			vertexList[currentVert].isInTree = true;//步骤2,放到树中
			nTree ++;
			for (int i = 0; i < nVerts; i++) {
				if(i == currentVert) continue; // visit other graph node
				if(vertexList[i].isInTree) continue;//visit other graph don't contain in tree -- to avoid connect unneccessary node
				int dis = adjMat[currentVert][i];
				if (dis == INFINITY) continue;
				putInPQ(i, dis);
			}
			if (priorityQueue.getSize() == 0) {
				return;
			}
			
			Edge currentMinEdge  = priorityQueue.removeMin();
			int sVert = currentMinEdge.srcVert;
			currentVert = currentMinEdge.destVert;
			System.out.println(vertexList[sVert].label);
			System.out.println(vertexList[currentVert].label);
			System.out.println(" ");
		}
		for (int i = 0; i < nVerts; i++) {
			vertexList[i].isInTree = false;
		}
	}
	
	/**
	 * 将循环操作1中的edge,放入优先队列中
	 * 优先队列中,到一个目的的边是唯一滴,所有当已经有老边了,需要比较替代
	 * @param vertex
	 * @param dis
	 */
	public void putInPQ(int vertex,int dis){
		int index = priorityQueue.find(vertex);
		if(index != -1){
			Edge tempEdge = priorityQueue.peek(index);
			int oldDis = tempEdge.distance;
			if(oldDis > dis){
				priorityQueue.remove(index);
				Edge theEdge = new Edge(currentVert, vertex, dis);
				priorityQueue.insert(theEdge);
			}
		}else{
			Edge theEdge = new Edge(currentVert, vertex, dis);
			priorityQueue.insert(theEdge);
		}
	}
	
	    public static void main(String[] args){  
	        Graph g = new Graph();  
	        g.addVertex('A');  
	        g.addVertex('B');  
	        g.addVertex('C');  
	        g.addVertex('D');  
	        g.addVertex('E');  
	        g.addVertex('F');  
	          
	        g.addEdge(0, 1, 6);  
	        g.addEdge(0, 3, 4);  
	        g.addEdge(1, 2, 10);  
	        g.addEdge(1, 3, 7);  
	        g.addEdge(1, 4, 7);  
	        g.addEdge(2, 3, 8);  
	        g.addEdge(2, 4, 5);  
	        g.addEdge(2, 5, 6);  
	        g.addEdge(3, 4, 12);  
	        g.addEdge(4, 5, 7);  
	        g.mstw();  
	    }  

}
 

 

分享到:
评论

相关推荐

    图的最小生成树PRIM算法课程设计

    图的最小生成树PRIM算法课程设计 本课程设计的主要目的是实现图的最小生成树,使用普里姆算法来实现。普里姆算法是一种常用的图算法,用于寻找无向图中的最小生成树。该算法通过逐个遍历图中的顶点,记录权值最小的...

    基于MATLAB的最小生成树Prim算法 源代码程序.rar

    最小生成树(Minimum Spanning Tree, MST)是图论中的一个重要概念,主要应用于网络设计、数据通信等领域,用于寻找连接所有顶点的边的集合,使得这些边的总权重尽可能小。在本压缩包中,提供了基于MATLAB实现的Prim...

    cpp-图论算法最小生成树Prim算法和Kruskal算法C实现

    本文将详细介绍两种经典算法来解决最小生成树问题:Prim算法和Kruskal算法,并以C语言实现为例进行讲解。 ### Prim算法 Prim算法是一种贪心算法,其基本思想是从一个初始节点开始,逐步添加最短的边,直到连接到...

    最小生成树prim算法

    Prim算法是一种用于寻找加权图最小生成树的经典算法,由捷克数学家Vojtěch Jarník在1930年提出,并由美国计算机科学家Robert C. Prim在1957年再次独立发现。 Prim算法的基本思想是逐步构建最小生成树,每次从已有...

    最小生成树_Prim算法实现C++

    在计算机科学中,Prim算法是一种常用的最小生成树算法,它可以用于解决无向图的最小生成树问题。 Prim算法的主要思想是,从某个起始点开始,逐步添加边,直到所有顶点都被连接。 在C++中,Prim算法可以通过以下...

    最小生成树Prim算法

    最小生成树是图论中的一个重要概念,用于寻找一个无向加权图的边集合,这些边连接了图中的所有顶点,且总权重尽可能小。Prim算法是解决这一问题的有效方法之一,由捷克数学家Vojtěch Jarník在1930年提出,后由...

    图的最小生成树prim算法

    ### 图的最小生成树Prim算法详解 在计算机科学与图论中,图的最小生成树(Minimum Spanning Tree,MST)是一个加权无向图的子图,它包含图中的所有顶点,并且所有边的权重之和最小。Prim算法是一种贪心算法,用于...

    最小生成树Prim算法的C语言程序

    "最小生成树Prim算法的C语言程序" Prim 算法是最小生成树的一种特殊算法,它的特点是集合 A 的边总是只形成单棵树。该算法的基本思路是:任选一个顶点(本实验取①为起始点),将其涂红,其余顶点为白点;在一个...

    最小生成树,Prim算法的使用(邻接矩阵实现).txt

    Prim算法是一种贪心算法,用于寻找带权无向图的最小生成树。该算法的基本思想是从任意一个顶点出发,逐步将权重最小的边添加到生成树中,直到包含所有顶点为止。 #### 三、Prim算法实现(邻接矩阵) 对于Prim算法...

    数据结构 图的最小生成树 C++描述 使用prim算法、kruskal算法

    综上所述,最小生成树是图论中的核心问题,Prim算法和Kruskal算法是解决该问题的两种高效方法。在C++中,这两个算法都可以利用标准库提供的功能来实现,从而在复杂度和空间效率上达到较好的平衡。理解并熟练掌握这些...

    acm 最小生成树 prim算法

    Prim算法是一种用于寻找图中所有顶点构成的最小生成树(Minimum Spanning Tree, MST)的经典算法之一。它适用于带权无向图,并且能够确保得到的MST具有最小的总权重。Prim算法的核心思想是从任意一个顶点出发,逐步...

    POJ 1751 求最小生成树prim算法(JAVA)

    标题 "POJ 1751 求最小生成树Prim算法(JAVA)" 提到的是一个编程挑战,涉及图论中的经典算法——Prim算法。在计算机科学中,Prim算法是用于寻找加权无向图的最小生成树的一种有效方法。最小生成树是一棵树形结构,...

    Prim算法与Kruskal算法求最小生成树

    最小生成树是图论中的一个重要概念,用于寻找一个无向加权图的边集合,使得这些边连接了图中的所有顶点,同时整个边集合的总权重尽可能小。在这个问题中,Prim算法和Kruskal算法是两种常用的方法。 1. Prim算法: ...

    最小生成树prim算法.pdf

    Prim算法是一种用于寻找带权图的最小生成树的算法,它适用于稠密图,即边的数量接近于顶点数量平方的图。 Prim算法的基本步骤如下: 1. 初始化:选择一个起点,通常选择任意一个顶点作为初始集合U的成员,U开始时...

    最小生成树Prim算法_rowr6q_.dn文件_prim算法_最小生成树_

    在压缩包中的"最小生成树Prim算法"文件,可能是包含了Prim算法的具体实现代码、示例输入输出或者相关教程。通过研究这个文件,可以深入理解Prim算法的工作原理,学习如何编写代码来解决最小生成树问题,也可以进行...

    用Prim和Kruskal算法构造最小生成树

    **Prim算法**是一种用于寻找加权图最小生成树的贪心算法。该算法以一个顶点为起点,逐步添加最短边来扩展生成树。具体步骤如下: 1. **初始化**:选择任意一个顶点作为起点,将该顶点加入到集合U(已加入生成树中的...

    最小生成树PRIM算法

    最小生成树是图论中的一个重要概念,用于寻找连接图中所有顶点的边集,使得这些边的总权重尽可能小。PRIM算法是由捷克数学家Vojtěch Jarník在1930年首次提出,后由美国计算机科学家R.E.普里姆(Prim)改进并推广,...

Global site tag (gtag.js) - Google Analytics