Prim算法JAVA 清楚易懂

import java.util.Scanner;

public class Prim {
    static int map[][];//图
    static int n;//节点个数
    static boolean vis[];//标记节点是否在树中
    public static void main(String[] args) {
        Scanner in =new Scanner(System.in);
        n=in.nextInt();//节点数
        map=new int[n][n];
        vis=new boolean[n];
        for (int i=0;i<n;i++){
            for (int j=0;j<n;j++){
                map[i][j]=in.nextInt();
            }
        }
        prim(0);
    }

    //prim方法,最小生成树算法
    //v节点值
    public static void prim(int v){
        vis[v]=true;
        //记录即将连接的两个点的坐标
        int h1=-1;
        int h2=-1;
        //总共要构建n-1条边连接n个顶点
        for (int k=1;k<n;k++){
            int minlen=Integer.MAX_VALUE;
            for (int i=0;i<n;i++){
                for (int j=0;j<n;j++){
                    //!!!!!!!!!如果你的两个点未连接的在矩阵中的值是-1或者Integer.MAX_VALUE,你要将下列map[i][j]!=0简单修改
                    if (vis[i]&&!vis[j]&&map[i][j]!=0&&map[i][j]<minlen){
                        //替换minlen(寻找已经访问过的节点和未访问节点的之间最短的边)
                        minlen=map[i][j];
                        h1=i;
                        h2=j;
                    }
                }
            }
            System.out.println("边"+k+": "+h1+"--->"+h2+"距离:"+minlen);
            vis[h2]=true;
        }
    }
}

上一篇:图解:如何实现最小生成树(Prim算法与Kruskal算法)


下一篇:最小生成树——Prim And Kruskal实现最小生成树