prim算法查找最小生成树

我们在图的定义中说过,带有权值的图就是网结构。一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边。所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接起来,并且使得权值的和最小。综合以上两个概念,我们可以得出:构造连通网的最小代价生成树,即最小生成树(Minimum Cost Spanning Tree)。找连通图的最小生成树,经典的有两种算法,普里姆算法和克鲁斯卡尔算法。

prim实现:

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Prim {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			int n = sc.nextInt();
			int m = sc.nextInt();
			if (n == 0 && m == 0) {
				break;
			}
			int[][] map = new int[n][n];
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < n; j++) {
					map[i][j] = Integer.MAX_VALUE;
				}
			}

			for (int i = 0; i < m; i++) {
				int u = sc.nextInt();
				int v = sc.nextInt();
				int w = sc.nextInt();
				map[u][v] = w;
				map[v][u] = w;
			}
			Edge[] e = new Edge[n];
			prim(map, e, n);
			for (int i = 0; i < n - 1; i++) {
				System.out.println(e[i].from + " " + e[i].end + " "
						+ e[i].weight);
			}

		}

	}

	static void prim(int[][] map, Edge[] e, int n) {
		Set<Integer> set1 = new HashSet<>();
		Set<Integer> set2 = new HashSet<>();
		set1.add(0);
		for (int i = 1; i < n; i++)
			set2.add(i);
		int min = Integer.MAX_VALUE;
		int k=0;
		while (!set2.isEmpty()) {
			min = Integer.MAX_VALUE;
			int flag1 = 0;
			int flag2 = 0;
			for (int i : set1) {
				for (int j : set2) {
					if (map[i][j] < min) {
						min = map[i][j];
						flag1 = i;
						flag2 = j;
					}
				}
			}
			set1.add(flag2);
			set2.remove(flag2);
			e[k]=new Edge();
			e[k].from=flag1;
			e[k].end=flag2;
			e[k].weight=min;
			k++;
		}

	}

	private static class Edge {
		int from;
		int end;
		int weight;
	}

}

  

时间: 2024-10-05 05:31:15

prim算法查找最小生成树的相关文章

普里姆Prim算法 - 图解最小生成树

我们在图的定义中说过,带有权值的图就是网结构.一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边.所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接起来,并且使得权值的和最小.综合以上两个概念,我们可以得出:构造连通网的最小代价生成树,即最小生成树(Minimum Cost Spanning Tree). 找连通图的最小生成树,经典的有两种算法,普里姆算法和克鲁斯卡尔算法,这里介绍普里姆算法. 为了能够讲明白这个算法,我们先构造网图的邻接矩阵,

hdu 1162 Eddy&amp;#39;s picture (Kruskal算法,prim算法,最小生成树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162 [题目大意] 给你n个点的坐标,让你找到联通n个点的一种方法.保证联通的线路最短,典型的最小生成树问题. 方法一 . 通过不断找到最小的边来找到终于结果. Kruskal 算法 #include <iostream> #include <algorithm> #include <cstdio> #include <cmath> using namespac

hdu 1162 Eddy&#39;s picture (Kruskal算法,prim算法,最小生成树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162 [题目大意] 给你n个点的坐标,让你找到联通n个点的一种方法,保证联通的线路最短,典型的最小生成树问题. 方法一 , 通过不断找到最小的边来找到最终结果. Kruskal 算法 #include <iostream> #include <algorithm> #include <cstdio> #include <cmath> using namespac

Prim算法解决最小生成树

一.最小生成树问题 什么是最小生成树问题?给你一个带权连通图,需要你删去一些边,使它成为一颗权值最小的树. 二.Prim算法 1)输入:输入一个带权连通图,顶点集合V,边集合E 2)初始化:Vnew={x},x为任意一个顶点,作为起始点,Enew={},为空 3)在集合E中选择权值最小的边<u,v>,其中u为集合Vnew中的顶点,而v不在集合Vnew中但在V中,(若有多条满足条件且权值相同时,可任选其中一条) 4)将v收录集合Vnew中,将<u,v>收录Enew中 5)重复步骤4.

算法设计和分析(Prim算法构建最小生成树)

问题: 给定无向图G(N,M)表明图G有N个顶点,M条边,通过Prim算法构造一个最小生成树 分析: 算法流程: 构造好的最小生成树就是step6 运行代码: #include<cstdio> #include<string.h> #include<algorithm> #include<cmath> #include<iostream> #include<vector> #include<queue> #include&

Prim算法:最小生成树---贪心算法的实现

算法图解: http://baike.baidu.com/link?url=hGNkWIOLRJ_LDWMJRECxCPKUw7pI3s8AH5kj-944RwgeBSa9hGpTaIz5aWYsl_sTyBgjxW-CnXn9LEHcy4GJE6N71Z7guFriwOVGLjGOFeaI44gRVid1N8iL-li-7wOt5WoH4K9zOTNFeeTB31HBOq 实现代码: http://blog.csdn.net/tingting256/article/details/504710

Prim算法求最小生成树

#include<iostream> using namespace std; #define MAXN 10002 int Map[100][100],Vis[100],Low[100],Tree[100]; int n; void Prim() { int i,j,p; int minc; memset(Vis,0,sizeof(Vis)); Vis[0]=1; for( i=1;i<n;i++) { Low[i]=Map[0][i]; Tree[i]=0; } for(i=1;i&

最小生成树之Prim算法

Prim算法: 假设N = (V,{E})是连通网,TE是N上最小生成树中边的集合.算法从U={u0}(u0属于V),TE={}开始,重复执行下述操作:在所有u属于U,v属于V-U的边(u,v)属于E中找到一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直至U=V为止,此时TE中必有n-1条边,则T=(V,{TE})为N的最小生成树. 为实现这个算法,需附设一个辅助数组closedge,以记录从U到V-U具有最小代价的边.对每个顶点vi属于V-U,在辅助数组中存在一个相应分量clos

数据结构(C实现)------- 最小生成树之Prim算法

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 算法描述 如果连通图是一个网,则称该网中所有生成树中权值总和最小的生成树为最小生成树,也称最小代价生成树.利用Prim算法构造的最小生成树方法思想: 假设G=(V,E)是一个具有n个顶点的连通网,顶点集V={v1,v2,...,vn}.设所求的最小生成树T=(U,TE),其中U是T的顶点集,TE是T的边集,U和TE初值均为空集. Prim算法的基本思想如下:首先从V中任取一