Prim算法是用来实现图最小生成树的2种常用方法之一,Prim算法的主要步骤如下:
设无向图有n个顶点,m条边,集合{S}与集合{V-S}
-
- 从图的N个点中任意选择一个加入集合{S},其他点属于{V-S}
- 从集合{S}的点中选择与{V-S}中点组成的边中最短的那条边,记录下来,同时将这条边的属于{V-S}的点加入进{S}中
- 重复第二步操作直至{S}中包含所有的点
- 记录的边便组成了最小生成树。
以下是java实现的代码(本代码已经在PKU2485中AC了):
代码中temp1与temp2分别记录{S}与{V-S}之间的点的所有边的长度及边在{V-S}中点的位置。一开始将第一个点作为起始点,同时第一个点的邻接边的长度加入temp1中,同时用temp2记录邻接边的另一个点的位置。
后面再从temp1中选择长度最短的边并且该边所对应的点属于{V-S}集合的点,将该边加入{S}中同时将该边的邻接边加入temp1中
如此循环n-1次便可完成最小生成树
import java.util.Scanner;
public class prim {
public static void main(String argvs[]){
int matrix[][];
int Max=65536;
int m,n,t,i,j,k,max_len,count,num,min,point=0;
int temp1[],temp2[],flag[];
Scanner in=new Scanner(System.in);
t=in.nextInt();
for(i=0;i<t;i++){
n=in.nextInt();
matrix=new int[n][n];
flag=new int[n];
for(j=0;j<n;j++)
flag[j]=0;
flag[0]=1;
count=0;
num=0;
min=Max;
max_len=0;
temp1=new int[n*(n-1)/2];
temp2=new int[n*(n-1)/2];
for(j=0;j<n;j++)
for(k=0;k<n;k++)
matrix[j][k]=in.nextInt();
for(j=1;j<n;j++){
temp1[num]=matrix[0][j];
temp2[num]=j;
num++;
}
while(count!=n-1){
for(j=0;j<num;j++)
if(min>temp1[j]&&flag[temp2[j]]==0){
min=temp1[j];
point=j;
}
if(min>max_len) max_len=min;
flag[temp2[point]]=1;
for(j=0;j<n;j++)
if(j!=temp2[point]&&flag[j]==0){
temp1[num]=matrix[temp2[point]][j];
temp2[num]=j;
num++;
}
min=Max;
count++;
}
System.out.println(max_len);
}
}
}