最小生成树之克鲁斯卡尔算法

最小生成树-克鲁斯卡尔算法-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);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_27378875/article/details/81167119