エンティティクラス:
パッケージ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版 王红梅等编著