最小生成树1——Prime算法

在这里插入图片描述
求解思路:
1.创建图;
2.prime;找出每次的最短路径

代码:

package com;

public class Graph {
    int verxs;  //表示图的结点的个数
    char[] data;  //表示各个结点的值
    int [][]weight;  //存放边

    public Graph(int verxs){
        this.verxs=verxs;
        data=new char[verxs];
        weight=new int[verxs][verxs];
    }
}

创建图并遍历

 //生成图
    public  void createGraph(Graph graph,int versx,char[] data,int [][]weight){
        int i,j;
        for(i=0;i<versx;i++){
            graph.data[i]=data[i];
            for(j=0;j<versx;j++){
                graph.weight[i][j]=weight[i][j];
            }
        }
    }

    //显示图,即临界矩阵
    public void show(Graph graph) {
        for(int []a:graph.weight){
            System.out.println(Arrays.toString(a));
        }
    }

  

prime算法:

  //Prime算法
    public void prime(Graph graph,int v){
        //visited[]:标记结点是否被访问过
        int []visited=new int[graph.verxs];

        //默认是0,表示没有被访问过
        for(int i=0;i<graph.verxs;i++){
            visited[i]=0;
        }
        //把当前节点标记为已访问
        visited[v]=1;

        //h1和h2记录两个两个顶点的下标
        int h1=-1;
        int h2=-1;
        int minWeight=100;   //将minWeight初始化成一个大数,后面遍历时,会替换掉

        //边数比点数少1
        for(int k=1;k<graph.verxs;k++){
            //确定每一次生成的作图和那个接地那距离最近
            for(int i=0;i<graph.verxs;i++){
                for(int j=0;j<graph.verxs;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;
            minWeight=100;

        }

    }

3.测试 :

  public static void main(String[] args) {
    char[] data={'A','B','C','D','E','F','G'};
    int verxs=data.length;
    int[][]weight={

            //100表示两点之间不连通
            {100,5,7,100,100,100,2},
            {5,100,100,9,100,100,3},
            {7,100,100,100,8,100,100},
            {100,9,100,100,100,4,100},
            {100,100,8,100,100,5,4},
            {100,100,100,4,5,100,6},
            {2,3,100,100,4,6,100}
    };
    Graph graph=new Graph(verxs);

    MIniTree mIniTree=new MIniTree();
    mIniTree.createGraph(graph,verxs,data,weight);

    mIniTree.show(graph);
        System.out.println("--------------");
    mIniTree.prime(graph,0);






    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值