先是数据结构定义--邻接表:
//弧的节点结构类型
class ANode implements Comparable<ANode>{
int adjVertex; //指向顶点在adjList的下标
ANode nextArc; //指向下一条弧
int value; //存放权值
@Override
public int compareTo(ANode o) {
// TODO Auto-generated method stub
if(this.value>o.value)
return 1;
else if(this.value<o.value)
return -1;
else
return 0;
}
}
//邻接表节点的类型
class VNode{
String name; //顶点信息
ANode firstArc; //指向第一条弧
}
//图的邻接表类型
class ALGraph{
VNode[] adjList;
int n; //图的顶点数n
int e; //图的边数e
public void prim(ALGraph AG,int[] visited,int[] dis){
//visited:数组用于记录顶点是否已加入连通集合
//dis:到已连通集合的最短距离
PriorityQueue<ANode> queue = new PriorityQueue<ANode>(); //优先队列
VNode v = null;
ANode e = null;
int end;
//初始化
for(int i=1;i<=AG.n;i++)
dis[i] = 10000;
visited[1] = 1; 将顶点1加入连通集合
System.out.println(AG.adjList[1].name);
v = AG.adjList[1];
e = v.firstArc;
while(e!=null){ 处理与顶点1相连的顶点
if(e.value<dis[e.adjVertex]){
dis[e.adjVertex] = e.value; //跟新dis数组
queue.add(e); //将边加入队列
}
e = e.nextArc;
}
while(!queue.isEmpty()){
e = queue.poll(); //取出队列的头元素,即与连通集合距离最小的边
end = e.adjVertex; //边指向的顶点的下标
if(visited[end]==1) //已访问,就跳过
continue;
visited[end]=1;
System.out.println(AG.adjList[end].name+" ("+e.value+")"); //输出刚刚加入集合的顶点及原来其与集合的最小边权值
v = AG.adjList[end];
e = v.firstArc;
while(e!=null){
if(visited[e.adjVertex]==0 && dis[e.adjVertex]>e.value){ //对于集合刚刚加入了一个顶点,遍历它相连的顶点(不在集合的那些)。
//因为与这个顶点不相连的其他顶点,与集合的最小距离也不会变!
dis[e.adjVertex] = e.value;
queue.add(e);
}
e = e.nextArc;
}
}
}
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
然后使用邻接矩阵的数据结构实现:
class Vertex {
String name; //顶点信息
}
class MGraph {
int n; //图的顶点数n
int e; //图的边数e
int[] vex ; //顶点数组
int[][] edges ; //邻接矩阵
public void prim(MGraph MG,int[] visited,int[] dis){
int n = MG.n;
for(int i=1;i<=MG.n;i++)
dis[i] = 10000;
visited[1] = 1;
System.out.println(1);
for(int i=1;i<=n;i++){
if(MG.edges[1][i]>0){
dis[i] = MG.edges[1][i];
}
}
int pos = 1;
int min;
for(int i=2;i<=n;i++){
min = 1000;
for(int j=1;j<=n;j++){
if(visited[j]==0 && min>dis[j])
{min = dis[j];pos = j;}
}
visited[pos] = 1;
System.out.println(pos+" ("+dis[pos]+")");
for(int j=1;j<=n;j++){
if(MG.edges[pos][j]>0){
dis[j] = MG.edges[pos][j];
}
}
}
}
}