首页 > 技术文章 > 使用java实现最小生成树prim算法

cai-cai777 2019-07-01 01:49 原文

实体类:

package com.caicai.prim.entity;
/**
 * 
 * @author caizy
 *
 */
public class ShortEdge {
    private int lowCost;//到连通树的最小权值
    private int adjvex;//使它到连通树的最小权值的那个节点编号
    public int getLowCost() {
        return lowCost;
    }
    public void setLowCost(int lowCost) {
        this.lowCost = lowCost;
    }
    public int getAdjvex() {
        return adjvex;
    }
    public void setAdjvex(int adjvex) {
        this.adjvex = adjvex;
    }
    

}
package com.caicai.prim.entity;

public class Graph<T> {
    private int vertexNum;//顶点数
    private T vertex[];//存放顶点信息的数组
    private int arcNum;//存放边数;
    private int arc[][];//存放边关系和边的权值:当为0时不存在边,大于零时有边且边为权值。
    public int getVertexNum() {
        return vertexNum;
    }
    public void setVertexNum(int vertexNum) {
        this.vertexNum = vertexNum;
    }
    public T[] getVertex() {
        return vertex;
    }
    public void setVertex(T[] vertex) {
        this.vertex = vertex;
    }
    public int getArcNum() {
        return arcNum;
    }
    public void setArcNum(int arcNum) {
        this.arcNum = arcNum;
    }
    public int[][] getArc() {
        return arc;
    }
    public void setArc(int[][] arc) {
        this.arc = arc;
    }
    
    

}

prim算法实现:

package com.caicai.prim;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

import com.caicai.prim.entity.Graph;
import com.caicai.prim.entity.ShortEdge;

/**
 * 
 * @author caizy
 *prim算法实现
 */
public class Prim<T> {
    private Map<Integer,ShortEdge> map = new HashMap<Integer, ShortEdge>();
    private Graph<T> graph;
    public Graph<T> getGraph() {
        return graph;
    }
    public void setGraph(Graph<T> graph) {
        this.graph = graph;
    }
    public Map<Integer,ShortEdge> prim() {
        initial();
        int arc[][]=graph.getArc();
        Map<Integer,ShortEdge> resultMap=new LinkedHashMap<Integer,ShortEdge>();
        while(map.size()>0) {
            int k = minEdge(map);
            resultMap.put(k,map.get(k) );
            map.remove(k);
            if(map.size()==0)
                break;
            for (int key:map.keySet()) {    
                if (arc[key][k] < map.get(key).getLowCost())
                    map.get(key).setLowCost(arc[k][key]);
                    map.get(key).setAdjvex(k);
            }    
        }
        return resultMap;
    }
    private void initial() {
        int arc[][]=graph.getArc();
        for(int i = 1; i < graph.getVertexNum(); i++) {
            ShortEdge shortEdge = new ShortEdge();
            shortEdge.setAdjvex(0);//开始的时候集合中只有一个顶点0
            if(arc[0][i]!=0)
                shortEdge.setLowCost(arc[0][i]);
            else
                shortEdge.setLowCost(Integer.MAX_VALUE);
            map.put(i,shortEdge);
        }
    }
    private int minEdge(Map<Integer,ShortEdge> map) {
        int min=Integer.MAX_VALUE;
        int found =0;
        for(Integer key: map.keySet()) {
            if(map.get(key).getLowCost()<min) {
                min=map.get(key).getLowCost();
                found=key;
            }
        }
        return found;
    }

}

测试类

package prim.test;

import java.util.Map;

import com.caicai.prim.Prim;
import com.caicai.prim.entity.Graph;
import com.caicai.prim.entity.ShortEdge;

public class PrimTest {
    
    public static void main(String args[]) {
        Graph<String> graph = new Graph<String>();
        graph.setVertexNum(4);
        graph.setArcNum(5);
        int arc[][] = new int[5][5];
        arc[0][1]=19;
        arc[1][0]=19;
        arc[1][2]=25;
        arc[2][1]=25;
        arc[1][3]=25;
        arc[3][1]=25;
        arc[2][3]=17;
        arc[3][2]=17;
        arc[2][0]=46;
        arc[0][2]=46;
        graph.setArc(arc);
        String vertex[]=new String[4];
        for (int i= 0;i<4;i++) {
            vertex[i]="顶点"+i;
        }
        graph.setVertex(vertex);
        Prim<String> prim =new Prim<String>();
        prim.setGraph(graph);
        Map<Integer,ShortEdge> resultMap=prim.prim();
        for(int key:resultMap.keySet()) {
            System.out.format("边为%d"+"-"+"%d,"+"权值为:%d\n",key,resultMap.get(key).getAdjvex(),
                    resultMap.get(key).getLowCost());
        }
        
    }

}

 测试结果:

参考书籍:数据结构(c++版)第2版 王红梅等编著

 

推荐阅读