プリム最小スパニングツリーアルゴリズムを達成するためにJavaを使用して

エンティティクラス:

パッケージcom.caicai.prim.entity;
 / ** 
 * 
 * @authorのcaizy 
 * 
 * / 
パブリック クラスSHORTEDGE {
     プライベート int型低コスト; // 最小重量ツリーの通信に
    プライベート int型 adjvexを; //は、最低限の通信ツリーにそれを作ります重みのノード番号
    パブリック INT getLowCost(){
         戻り低コストを; 
    } 
    公共 ボイド setLowCost(INT 低コスト){
         この .lowCost = 低コスト; 
    } 
    公共 のint getAdjvex(){
         リターンadjvex; 
    } 
    公共 ボイド setAdjvex(INT adjvex){
         この .adjvex = adjvex。
    } 
    

}
パッケージcom.caicai.prim.entity、

パブリック クラスグラフ<T> {
     プライベート INT vertexNum; // 頂点の数
    プライベート T頂点[]; // ストア頂点配列情報
    プライベート INT arcNum; //は、辺の数を格納し、
    プライベート INT ARC [] []; // 店舗側関係とエッジの重み:エッジが存在しない場合0、重みを側にゼロより大きく、側面があります。
    公共 INT getVertexNum(){
         戻りvertexNumを; 
    } 
    公共 ボイド setVertexNum(INT vertexNum){
         この .vertexNum = vertexNum; 
    }
    公共T [] getVertex(){
         戻り頂点。
    } 
    公共 ボイドsetVertex(T []頂点){
         この .vertex = 頂点。
    } 
    公共 INT getArcNum(){
         戻りarcNumと、
    } 
    公共 ボイド setArcNum(INT arcNum){
         この .arcNum = arcNum。
    } 
    公共 のint [] [] getArc(){
         戻りアーク。
    } 
    公共 ボイド setArc(INT [] []アーク){
         この.ARC = アーク。
    } 
    
    

}

プリムのアルゴリズム:

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版 王红梅等编著

 

おすすめ

転載: www.cnblogs.com/cai-cai777/p/11111993.html