Prim算法求最小生成树

一.Prim算法

        prim算法是用来求最小生成树的问题具体就是在一个图的n个节点找到n-1条边,使这n-1条边的权值最小

二.修路问题

在狗熊岭有如下七个村庄

村庄道路连接情况和距离如图所示

现在需要找到一个修路方法,使得每个村庄都能连通且总距离最近

 思路就是假设从A开始

找到与A相连的最短村庄G

然后以A和G为起始村庄寻找与其连接最小的点

(要以访问过的点为起始点寻找未被访问过的点)

从图中看找到B

一次类推直到找到六条最小边

三.代码实现

prim算法实现

public class Graph{
    private char[] vertexList;//存储顶点
    private int[][] edges;//存储图
    private int numberOfVertex;//顶点个数
    private static int Min = 10000;//存储一个较大权值
    
    Graph(char[] vertexList,int[][] edges,int numberOfVertex){
        //初始化村庄
        this.numberOfVertex = numberOfVertex;
        this.edges = new int[numberOfVertex][numberOfVertex];
        this.vertexList = new char[numberOfVertex];

        for(int i = 0;i<numberOfVertex;i++){
            this.vertexList[i] = vertexList[i];
            for(int j = 0;j<numberOfVertex;j++){
                this.edges[i][j] = edges[i][j];
            }
        }
    }
    public void showGraph(){
        for(int[] i:edges){
            System.out.println(i.toString());
        }
    }
    public void prim(int start){

        int sumPath = 0;//记录最短距离总和
        boolean[] isVisit = new boolean[numberOfVertex];//存储访问信息
        isVisit[start] = true;
        int x = -1;
        int y = -1;
        for(int k = 1;k<numberOfVertex;k++){//一共有n-1条边,循环n-1次

            int minPath = Min;

            for(int i = 0;i<numberOfVertex;i++){
                for (int j = 0;j<numberOfVertex;j++){
                    if(isVisit[i]&&!isVisit[j]&&edges[i][j]<minPath){
                        //更新最短路径
                        minPath = edges[i][j];
                        //xy记录距离i最近的村庄j的下标
                        x = i;
                        y = j;
                    }
                }
            }

            System.out.println("<"+vertexList[x]+","+vertexList[y]+">"+",权值:"+edges[x][y]);//输出修路情况
            sumPath += edges[x][y];
            isVisit[y] = true;//将以及访问过的节点记录
        }
        System.out.println("最短路径:"+sumPath);
    }
}

测试

    public static void main(String[] args) {
        char[] vertex = {'A','B','C','D','E','F','G'};//七个村庄
        int[][] weigth = {
                {Min,5,7,Min,Min,Min,2},
                {5,Min,Min,9,Min,Min,3},
                {7,Min,Min,Min,8,Min,Min},
                {Min,9,Min,Min,Min,2,Min},
                {Min,Min,8,Min,Min,5,4},
                {Min,Min,Min,4,5,Min,6},
                {2,3,Min,Min,4,6,Min}
        };//村庄联通关系
        Graph graph = new Graph(vertex,weigth,vertex.length);//图
        graph.prim(1);
    }

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值