您的位置:首页 > 其它

Kruskal(克鲁斯卡尔)

2013-08-07 18:14 162 查看


设有一个有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
=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+"]";
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: