最小生成树

/** 
02. * 定义基本数据结构 
03. * @author 小宇 
04. */  
05.  
06.public class MGraph  
07.{    
08.    //当边edges[i][j]不存在时,用null表示其值  
09.    public static final int NULL = 1000;  
10.    static final int MAXV = 100;                    
11.    //边集  
12.    int[][] edges = new int[this.MAXV][this.MAXV];  
13.    //顶点数,和边数  
14.    int n,e;             
15.}  
/** 
02. * 该结构用于克鲁斯卡尔算法 
03. * @author 小宇 
04. */  
05.public class EStruct implements Comparable<EStruct>   
06.{  
07.    int begin;                           
08.    int end;  
09.    int weight;  
10.    //用于给List<EStruct>排序,实现接口comparable方法  
11.    public int compareTo(EStruct e)  
12.    {  
13.        return this.weight - e.weight;  
14.    }  
15.  
16.}  
/** 
02. * 生成邻接矩阵并输出 
03. * @author 小宇 
04. * 
05. */  
06.  
07.public class CreateGraph {  
08.    public void createMat(MGraph g, int A[][], int n)  
09.    {                
10.        int i, j;  
11.        g.n = n;  
12.        g.e = 0;  
13.        for(i = 0; i < n; i++)  
14.            for(j = 0; j < n; j++)  
15.            {  
16.               g.edges[i][j] = A[i][j];  
17.                if(g.edges[i][j] != 1000)  
18.                    g.e++;  
19.            }  
20.    }  
21.    //---------------------------------------------------  
22.    public void DispMat(MGraph g)  
23.    {  
24.        int i, j;  
25.        for(i = 0; i < g.n; i++)  
26.        {  
27.            for(j = 0; j < g.n; j++)  
28.                if(g.edges[i][j] == g.NULL)  
29.                    System.out.print("-" + " ");  
30.                else  
31.                  System.out.print(g.edges[i][j] + " ");  
32.            System.out.println();  
33.        }  
34.    }  
35.  
36.}  
import java.util.ArrayList;  
02.import java.util.Collections;  
03.import java.util.List;  
04./** 
05. * 核心算法 
06. * 用prim算法及克鲁斯卡尔算法求解最小生成树 
07. * @author 小宇 
08. * 
09. */  
10.public class MinimalSpanningTree {  
11.      
12.    static final int INF = 32767;  
13.      
14.    private  List<EStruct> eArray = new ArrayList<EStruct>();  
15.      
16.    //--------------------------------Prim算法--------------------------------  
17.    public void Prim(MGraph g, int v)  
18.    {  
19.        int[] lowcost = new int[g.n];  
20.        int min;  
21.        int[] closest = new int[g.n];  
22.        int i,j,k = 0;  
23.        for(i = 0; i < g.n; i++)  
24.        {  
25.            lowcost[i] = g.edges[v][i];  
26.            closest[i] = v;  
27.        }  
28.        for(i = 1; i < g.n; i++)  
29.        {  
30.            min = INF;  
31.            for(j = 0; j < g.n; j++)  
32.                if(lowcost[j] != 0 && lowcost[j] < min)  
33.                {  
34.                    min = lowcost[j];  
35.                    k = j;  
36.                }  
37.            System.out.println(  "边" + closest[k] + "," + k + "权值" + min);  
38.            lowcost[closest[k]] = 0;  
39.            lowcost[k] = 0;  
40.            for(j = 0; j < g.n; j++)  
41.                if(g.edges[k][j] != 0 && g.edges[k][j] < lowcost[j])  
42.                {  
43.                    lowcost[j] = g.edges[k][j];  
44.                    closest[j] = k;  
45.                }  
46.        }  
47.    }  
48.    //---------------------克鲁斯卡尔算法-----------------------------------------------  
49.    public void getEStruct(MGraph mgraph)  
50.    {  
51.        /** 
52.         * 用EStruct结构保存每条边 
53.         * 最后存于EStruct数组 
54.         * 然后用java类库提供方法排序 
55.         */  
56.        for(int i = 0;i < mgraph.n; i++)  
57.        {  
58.            for(int j = 0; j < mgraph.n; j++)  
59.            {  
60.                //由于是无向图  
61.                if(j < i)  
62.                {  
63.                    //如果begin:i , end: j ,的边存在  
64.                    if(mgraph.edges[i][j] != mgraph.NULL)  
65.                    {  
66.                        //创建EStruct保存该边信息并加入List:eArray  
67.                        EStruct estruct = new EStruct();  
68.                        estruct.begin = i;  
69.                        estruct.end = j;  
70.                        estruct.weight = mgraph.edges[i][j];  
71.                        eArray.add(estruct);  
72.                    }  
73.                }  
74.            }  
75.        }  
76.        //用java类库提供方法排序  
77.        Collections.sort(eArray);  
78.    }  
79.      
80.    //查找连线顶点的尾部下标  
81.    public int find(int[] p,int f)  
82.    {  
83.        while(p[f] != 0)  
84.            f = p[f];  
85.        return f;  
86.    }  
87.  
88.    public void Kruskal(MGraph mgraph)  
89.    {  
90.        int i, n, m;  
91.        //parent数组用于判断数组边集是否形成环路  
92.        int[] parent = new int[eArray.size()];  
93.        //初始化数组为零  
94.        for(i = 0; i < eArray.size(); i++)  
95.            parent[i] = 0;  
96.        //循环生成最小生成树,最小生成树的边数为图的(顶点数 - 1)  
97.        for(i = 0; i  < mgraph.n - 1; i++)  
98.        {  
99.            n = find(parent, eArray.get(i).begin);  
100.            m = find(parent,eArray.get(i).end);  
101.            //如果n不等于m说明此边与现有生成树没有形成环路  
102.            if(n != m)  
103.            {  
104.                //将此边的表尾节点放入下标为起点的parent中  
105.                //表明此顶点已在生成树集合中  
106.                parent[n] = m;  
107.                System.out.println(eArray.get(i).begin + "," +  eArray.get(i).end + "  权:" + eArray.get(i).weight);  
108.            }  
109.        }  
110.    }  
111.}  
/** 
02. * 测试代码 
03. * 生成邻接矩阵->prim->kruskal 
04. * @author 小宇 
05. * 
06. */  
07.  
08.public class Test   
09.{  
10.    public static void main(String[] args)  
11.    {  
12.        MGraph mgraph = new MGraph();  
13.          
14.        int[][] array = new int[6][6];  
15.        for(int i = 0;i < 6; i++)  
16.            for(int j = 0;j < 6; j++)  
17.                array[i][j] = mgraph.NULL;  
18.        array[0][1] = 6;  
19.        array[1][0] = 6;          
20.        array[0][3] = 5;  
21.        array[3][0] = 5;  
22.        array[0][2] = 1;  
23.        array[2][0] = 1;  
24.        array[1][2] = 5;  
25.        array[2][1] = 5;  
26.        array[2][3] = 5;  
27.        array[3][2] = 5;  
28.        array[1][4] = 3;  
29.        array[4][1] = 3;  
30.        array[4][2] = 6;  
31.        array[2][4] = 6;  
32.        array[2][5] = 4;  
33.        array[5][2] = 4;  
34.        array[4][5] = 6;  
35.        array[5][4] = 6;  
36.        array[3][5] = 2;  
37.        array[5][3] = 2;  
38.          
39.      
40.        CreateGraph myGraph = new CreateGraph();  
41.  
42.        System.out.println("创建邻接矩阵:");  
43.        myGraph.createMat(mgraph,array, 6);  
44.        myGraph.DispMat(mgraph);  
45.          
46.        System.out.println("Prim算法生成最小生成树:");  
47.        MinimalSpanningTree mst = new MinimalSpanningTree();  
48.        mst.Prim(mgraph, 0);  
49.          
50.        mst.getEStruct(mgraph);  
51.        mst.Kruskal(mgraph);  
52.    }  
53.}  
原文地址:https://www.cnblogs.com/rixiang/p/4705844.html