关闭

java 普里姆(Prim)算法求图的最小生成树

标签: java算法prim
492人阅读 评论(0) 收藏 举报
分类:
  1. 基本思想:
    设G=(V,E)是连通网,T=(U,D)是最小生成树,V,U是顶点集合,E,D是边的集合
    ①若从顶点u开始构造最小生成树,则从集合V中取出顶点u放入集合U中,标记顶点v的visited[u]=1;
    ②若集合U中顶点ui与集合V-U中的顶点vj之间存在边,则寻找这些边中权值最小的边,但不能构成回路,将顶点vj加入集合U中,将边(ui,vj)加入集合D中,标记visited[vj]=1;
    ③重复步骤②,直到U与V相等,即所有顶点都被标记为访问过,此时D中有n-1条边。

  2. 设计图的邻接矩阵数据结构

public class MGraph {
    /*图的邻接矩阵表示*/
    int vexs;  //图中结点数目
    char data[];  //存放结点数据
    int [][]weight;  //存放边
    public MGraph(int ve){
        vexs=ve;
        data=new char[ve];
        weight=new int[ve][ve];
    }       
}
  1. 最小生成树算法
public class MinTree {

    /*创建图的邻接矩阵*/
    public void CreateGraph(MGraph graph,int vexs,char data[],int [][]weight){
        int i,j;
        for(i=0;i<vexs;i++){
            graph.data[i]=data[i];
            for(j=0;j<vexs;j++){
                graph.weight[i][j]=weight[i][j];
            }
        }
    }

    public void Prim(MGraph graph,int v){
        /*graph为图的邻接矩阵表示,v为起始顶点*/
        int visited[]=new int[graph.vexs];  // visited[]标记结点是否被访问过
        for(int i=0;i<graph.vexs;i++){   //初始化visited[]
            visited[i]=0;
        }

        visited[v]=1;
        int h1=-1,h2=-1;   //记录边的弧尾和弧头
        int minweight=10000;//minweight记录最小权重
        for(int k=1;k<graph.vexs;k++){  //vexs个顶点,最小生成树中有vexs-1条边

            for(int i=0;i<graph.vexs;i++){  //i顶点表示被访问过的顶点
                for(int j=0;j<graph.vexs;j++){  // j顶点表示未被访问过的顶点
                    if(visited[i]==1 && visited[j]==0 && graph.weight[i][j]<minweight){
                        //寻找已访问的顶点与未访问的定点间的权值最小的边
                        minweight=graph.weight[i][j];
                        h1=i;
                        h2=j;
                    }
                }
            }

            System.out.println("边<"+graph.data[h1]+","+graph.data[h2]+"> 权值:"+minweight);
            visited[h2]=1;   //标记h2被访问过
            minweight=10000;
        }

    }

    public static void main(String args[]){
        char []data=new char[]{'A','B','C','D','E'};
        int vexs=data.length;
        int [][]weight=new int[][]{
                {10000,4,8,5,10000},
                {4,10000,3,10000,7},
                {8,3,10000,6,6},
                {5,10000,6,10000,9},
                {10000,7,6,9,10000}
                };

        MGraph graph=new MGraph(vexs);
        MinTree mt=new MinTree();
        mt.CreateGraph(graph,vexs,data,weight);
        mt.Prim(graph, 0);
    }

}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

最小生成树的Prim算法和Kruskal算法java代码实现

MiniSpanTree中两个静态函数实现了最小生成树的Prim算法和Kruskal算法: package datastucture; import java.util.ArrayList; ...
  • WitsMakeMen
  • WitsMakeMen
  • 2013-05-06 10:18
  • 9140

最小生成树Prim算法理解

MST(Minimum Spanning Tree,最小生成树)
  • yeruby
  • yeruby
  • 2014-08-16 18:49
  • 84064

图基本算法 最小生成树 Prim算法(邻接表/邻接矩阵+优先队列STL)

这篇文章是对《算法导论》上Prim算法求无向连通图最小生成树的一个总结,其中有关于我的一点点小看法。   最小生成树的具体问题可以用下面的语言阐述:     输入:一个无向带权图G=(V,E)...
  • tham_
  • tham_
  • 2015-05-27 16:47
  • 2966

用普里姆(Prim)算法构造最小生成树

  • 2009-10-13 21:13
  • 200KB
  • 下载

求最小生成树,普里姆(Prim)算法

1、 相关概念 1)生成树 一个连通图的生成树是它的极小连通子图,在n个顶点的情形下,有n-1条边。生成树是对连通图而言的,是连同图的极小连通子图,包含图中的所有顶点,有且仅有n-1...
  • arhaiyun
  • arhaiyun
  • 2013-10-01 02:09
  • 1122

求最小生成树,普里姆(Prim)算法

1、 相关概念 1)生成树   一个连通图的生成树是它的极小连通子图,在n个顶点的情形下,有n-1条边。生成树是对连通图而言的,是连同图的极小连通子图,包含图中的所有顶点,有且仅有n-1条边。非...
  • allenguo123
  • allenguo123
  • 2013-11-29 14:35
  • 614

图的最小生成树之普里姆Prim算法

源代码如下: #include using namespace std; #define MAX_VERTEX_NUM 20 #define infinity 9 typedef int QEle...
  • wen942467928
  • wen942467928
  • 2015-08-15 15:57
  • 632

普里姆算法(Prim算法求最小生成树)

普里姆算法的基本思想:普里姆算法是一种构造最小生成树的算法,它是按逐个将顶点连通的方式来构造最小生成树的。时间复杂度为O(n^2)。 从连通网络N = { V, E }中的某一顶点u0出发,选择与它...
  • xinlingchengbao
  • xinlingchengbao
  • 2016-08-05 18:59
  • 985

C++ 最小生成树之Prim(普里姆)算法

最小生成树之Prime(普里姆)算法 最小生成树:是在一个给定的无向图G(V,E)中求一棵树T,使得这棵树拥有图G中的所有顶点,且所有边都是来自图G中的边,并且满足整棵树的边权之和最小。 如上...
  • YF_Li123
  • YF_Li123
  • 2017-07-15 11:29
  • 567

最小生成树之Prim(普里姆)算法

最小生成树之Prim(普里姆)算法
  • u012965373
  • u012965373
  • 2015-08-11 15:18
  • 1258
    个人资料
    • 访问:15171次
    • 积分:484
    • 等级:
    • 排名:千里之外
    • 原创:34篇
    • 转载:2篇
    • 译文:0篇
    • 评论:1条
    文章存档
    最新评论