Kruskal(克鲁斯卡尔)_连通分量

 

设有一个有n个顶点的连通网N={V,E},最初先构造一个只有n个顶点,
没有边的非 连通图 T={V, E}, 图中每个顶点自成一个连通分量。
当在E中选到一条具有最小权值的边时,若该边的两个顶点落在不同的连通分量上,
则将此边加入到T中;否则将此边舍去,重新选择一条权值最小的边。
如此重复下去,直到所有顶点在同一个连通分量上为止。

 

import java.io.BufferedInputStream;
import java.util.*;
/*
 * @author denghuilong 
 *  
 * 2013-8-7上午11:36:00
 *
*/
public class Kruskal{
	public static void main(String args[]){
		ArrayList<P> ay=new ArrayList<P>();
		P p0=new P(0, 1, 10);
		P p1=new P(0, 5, 11);
		P p2=new P(1, 8, 12); 
		P p3=new P(1, 2, 18);
		P p4=new P(1, 6, 16);
		P p5=new P(2, 8, 8);
		P p6=new P(2, 3, 22);
		P p7=new P(3, 4, 20);
		P p8=new P(3, 7, 16);
		P p9=new P(3, 6, 24);
		P p10=new P(3, 8, 21);
		P p11=new P(4, 7, 7);  
		P p12=new P(4, 5, 26);
		P p13=new P(5, 6, 17);
		P p14=new P(6, 7, 19);
		ay.add(p0);
		ay.add(p1);
		ay.add(p2);
		ay.add(p3);
		ay.add(p4);
		ay.add(p5);
		ay.add(p6);
		ay.add(p7);
		ay.add(p8);
		ay.add(p9);
		ay.add(p10);
		ay.add(p11);
		ay.add(p12);
		ay.add(p13);
		ay.add(p14);
		System.out.println("按权值排序");
		Collections.sort(ay);
		for(P pp:ay){
			System.out.println(pp);
		}
		System.out.println("Kruskal(克鲁斯卡尔)");
		int length=ay.size();
		int patten[]=new int[length];//判断是否构成回路
		for(int i=0;i<length;i++){
			//查找定点尾部的下标
			int n=find(patten,ay.get(i).start);
			int m=find(patten,ay.get(i).end);
			if(n!=m){
				patten[n]=m;
				System.out.println(ay.get(i));
			}
		}	
	}
	public static int find(int patten[],int m){
		
		return patten[m]>0?patten[m]:m;
	}
}
class P implements Comparable<P>{
	public  int start;
	public int end;
	public int num;
	public P(int start, int end, int num) {
		this.start = start;
		this.end = end;
		this.num = num;
	}
	public int compareTo(P o) {
		return this.num>o.num?1:-1;
	}
	public String toString(){
		return "["+start+","+end+","+num+"]";
	}
}