最小生成树-克鲁斯卡尔算法-Java版(无向图)
关键在于判断是否能够形成环
判断依据:所有的结点都是层层指向最大的结点,如果最后一个相等,说明可以形成环,例如:
1->3->5与4->5可以形成环
package 最小生成树之克鲁斯卡尔算法;
class MGraph{
public int[][] arc;
public int vertices;
public MGraph(int n){
vertices = n;
arc = new int[n][n];
}
public void addEdge(int i,int j){
if(i==j){
return;
}
arc[i][j]=1;
}
}
//主体在于边
public class Kruskal {
void MiniSpanTree_Kruskal(MGraph G){
int[] lowcost = new int[G.vertices]; //用来标识是否访问过
int min = Integer.MAX_VALUE;
int row=0,col=0,k=1,m,n;
while(k<G.vertices){
min = Integer.MAX_VALUE;
for(int i=0;i<G.vertices;i++){
for(int j=i+1;j<G.vertices;j++){
if(G.arc[i][j]<min&&Find(lowcost,i)!=Find(lowcost,j)){ //形不成环
min = G.arc[i][j];
row = i;
col =j;
}
}
}
System.out.printf("min:%d (%d,%d)->", min,row,col);
if(Find(lowcost,row)<Find(lowcost,col)){
lowcost[Find(lowcost,row)]=Find(lowcost,col);
}
else{
lowcost[Find(lowcost,col)]=Find(lowcost,row);
}
k++;
}
}
int Find(int[] lowcost,int f){
while(lowcost[f]>0){
f = lowcost[f];
}
return f;
}
public static void main(String[] args) {
MGraph graph = new MGraph(6);
int[][] temp={{65535,6,1,5,65535,65535},
{6,65535,5,65535,3,65535},
{1,5,65535,5,6,4},
{5,65535,5,65535,65535,2},
{65535,3,6,65535,65535,6},
{65535,65535,4,2,6,65535}};
/*int[][] temp={{65535,1,2,3,4,65535},
{1,65535,65535,65535,65535,35},
{2,65535,65535,65535,8,65535},
{1,65535,65535,65535,65535,65535},
{4,65535,8,65535,65535,65535},
{65535,35,65535,65535,65535,65535}};*/
graph.arc=temp;
new Kruskal().MiniSpanTree_Kruskal(graph);
}
}