普利姆(Prim)算法

普利姆算法主要是寻找图的最小生成树,最小生成树自己百度啦直接看普利姆算法的工作流程啊
在这里插入图片描述
假设我们从A点开始生成最小生成树
A的邻边为 : (A-C)[7] (A-G)[2] (A-B)[5]
1. 从邻边中删选最小权值的结点,将其加入生成树, 所以我们就有两个节点 (A, G)
2. 从(A, G)整体子图的邻边中筛选出一个最小权值节点
(A-C)[7] (G-E)[4] (G-B)[3] (G-F)[6]
3. 选出是B节点, 将其加入生成树 ,所以现在是 (A,B,G)三个节点了
4. 从(A, B, G) 子图的邻边中选出一个最小权值节点, 加入生成树

下面看java代码

import java.util.Arrays;
import java.util.Scanner;

public class Prim {
	private static Graph g = new Graph(9, 15);
	
	public static void main(String[] args) {
		prim_a(0);
	}
	// start表示从哪一个顶点开始
	public static void prim_a(int start){
		
		int[] pre = new int[g.vertiesNum];// 记录下一个节点的上一个节点
		int[] data = new int[g.vertiesNum];// 巨鹿各边的权值
		
		
		// 现在要找下一个节点
		 // 1. pre中全部赋值为start -> 下一个节点是从start找到的
		// 1. data中全部为start直接相连的边的权值
		for(int i = 0; i < g.vertiesNum; i++){
			
			pre[i] = start;
			data[i] = g.map[start][i];
			
		}
		
		data[start] = 0; // data[i] = 0表示i节点已经加入到最小生成树中
		
		//要找n -1 条边  循环n-1次
		for(int i = 1; i < g.vertiesNum; i++){
			
			// 从data数组找最小的权值
			int min = 65560;
			int index = 0;
			for(int j = 0; j < g.vertiesNum; j++){
			// 已经加入生成树的节点就不需要了
				if(data[j] != 0 && min > data[j]){
					min = data[j];
					index = j;
				}
			}
			
			data[index] = 0;  //将这个找到的节点加入生成树	
			System.out.println("("+ g.verties[pre[index]] +", " + g.verties[index]+ ")");
			
			// 将刚才找到的节点 跟之前所有找到的节点作为整体, 更新data数组和pre数组
			for(int j = 0; j < g.vertiesNum; j++){
				if(data[j] != 0 && g.map[index][j] < data[j]){
					data[j] = g.map[index][j];
					pre[j] = index;
				}	
			}
					
		}

	}
}




class Graph{
	String[] verties; // 顶点集合
	int[][] map;	// 邻接矩阵
	int vertiesNum;	// 顶点数目
	int edgeNums;  // 边的树数目
	
	
	public Graph(int vertiesNum, int edgeNums){
		
		this.vertiesNum = vertiesNum;
		this.edgeNums = edgeNums;
		int i = 0;
		
		verties = new String[vertiesNum];
		map = new int[vertiesNum][vertiesNum];
		
		Scanner scan = new Scanner(System.in);
		System.out.println("请输入顶点, 空格隔开");
		String vertiesLine = scan.nextLine();

		for(String v: vertiesLine.split(" ")){
			verties[i++] = v;
		}
		for(i = 0; i < vertiesNum; i++){
			
			Arrays.fill(map[i], 65560);
			
			map[i][i] = 0;
		}
		System.out.println("请输入变信息");
		for(int j = 0; j < edgeNums; j++){
			String[] next = scan.nextLine().trim().split(" ");
			int x = Integer.parseInt(next[0]);
			int y = Integer.parseInt(next[1]);
			int quan = Integer.parseInt(next[2]);
			map[x][y] = quan;
			map[y][x] = quan;				
		}
		
		
		scan.close();

	}
}

猜你喜欢

转载自blog.csdn.net/weixin_44112559/article/details/106795726