Prim算法java

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Prim {

    public char[] vexs;//节点
    public int vex_number;//节点数
    public int edge_number;//边数
    public int[][] Matrix;//图矩阵
    Scanner input = new Scanner(System.in);
    /**
     * 创建图
     */
    public void initialMatrix(){
        //初始化节点,小写字母的节点形式
        vexs =new char[] {'a','b','c','d','e','f'};
        vex_number = vexs.length;
        Matrix = new int[vex_number][vex_number];
        //领接矩阵赋初值为0
        for (int i=0;i<vex_number;i++){
            for (int j=0;j<vex_number;j++){
                Matrix[i][j] = 0;
            }
        }
        //初始化边
        System.out.println("Please input the number of edges");
        edge_number = input.nextInt();
        input.nextLine();  //去回车
        System.out.println("Please intput the edges like (a b weight)");
        char ch_start;
        char ch_end;
        int weight;
        //获取边的信息
        for (int i=0;i<edge_number;i++){
            String info = input.nextLine();
            ch_start = info.charAt(0);
            ch_end = info.charAt(2);
            weight = Integer.valueOf(info.charAt(4));
            //生成矩阵,无向图,矩阵需对称
            Matrix[ch_start-'a'][ch_end-'a'] = (weight-'0');
            Matrix[ch_end-'a'][ch_start-'a'] = (weight-'0');
        }


    }

    public void prim(List<Integer> temp){
        if(temp.size()==vex_number) return;
        int MinWeight = 100;
        int i=0;
        int index_x = 0,index_y=0;
        for (i=0;i<temp.size();i++){
            int t1 = temp.get(i);
            for (int j=0;j<Matrix[t1].length;j++){
                //查找temp中的节点所有相邻的且没有被访问过的节点
                if(Matrix[t1][j]<MinWeight && Matrix[t1][j]>0 && !temp.contains(j)){
                    MinWeight = Matrix[t1][j];
                    index_x = temp.get(i);
                    index_y = j;
               }

           }
        }
        temp.add(index_y);
        System.out.printf("%c->%c   权重为:%d\n",(index_x+'a'),(index_y+'a'),MinWeight);
        prim(temp);

    }

    /**
     * 显示图的邻接矩阵
     */
    public void display(int [][] mar){
        System.out.println("图的领接矩阵为");
        for (int i=0;i<mar.length;i++){
            for (int j=0;j<mar[i].length;j++){
                System.out.print(mar[i][j]);
                System.out.print("  ");
            }
            System.out.println("\n");
        }
    }

    public static void main(String [] args){
        Prim p = new Prim();
        p.initialMatrix();
        p.display(p.Matrix);
        //用a放已经访问过的节点,起始放0代表a,之后没获取一个最短边,就把对应的节点以数字形式加入到a中
        List<Integer> a = new ArrayList<>();
        a.add(0);
        p.prim(a);
    }

}



猜你喜欢

转载自blog.csdn.net/sinat_40553837/article/details/84192663