kruskal 算法java实现

 
public class Class_Kruskal
{

 /**
  * @param args
  */
 private int[][] List_Graph;
 private  int[] Label;
 private int[] Weight;
 private int[] Index_1;
 private int[] Index_2;
 private String Result;
 public Class_Kruskal()//使用构造函数进行初始化数据
 {
    List_Graph = new int[][]
                         {{0,1,4,5},
      {1,0,32768,2},
      {4,32768,0,3},
      {5,2,3,0}
      };//初始化graphic中点和点的距离,32767表示距离无穷大
    //另外一个测试用例是
    /*
  {0,1,2,32767,32767},
  {1,0,2,4,3},
  {2,2,0,4,4},
  {32767,4,4,0,2},
  {32767,3,4,2,0}*/
  Label = new int[List_Graph.length];
  for(int i = 0; i < Label.length; i++)//初始化标记
  {
   Label[i] = i;
  }
     int j = (int)(Label.length + 1)*Label.length/2;
  Weight = new int[j];//用于存储待排序边的权值,数组长度m=(n+1)*n*0.5,其中节点个数为n
  Index_1 = new int[j];//用于存储边的两个节点
  Index_2 = new int[j];
 
  Result = "最小生成树的边是:"+"/n";//记录最小生成树的边
 }
 public String Get_Result()//获得变量Result
 {
  return Result;
 }
 //把边按权排序,graphic是List_Graphic
 public  int[] sort()
 {
  int[] a;
  int index = 0;
  for(int i = 0; i < Label.length; i++)
   for(int j = i+1; j < Label.length; j++)
   {
    if(List_Graph[i][j] < 32767)
    {
     Weight[index] = List_Graph[i][j];
     Index_1[index] = i;
     Index_2[index] = j;
     
     index = index + 1;
    }
   }
  a = new int[index - 1];
  a = Address_Sort(Weight,Weight.length);
  return a;
 }
 public int[] Address_Sort(int[] a,int n)//地址排序
 {
  int[] Res = new int[n];
  for(int i = 0 ; i < n; i++)
  {
   Res[i]  = i;
  }
  int t;
  int k;
  for(int j = 0 ; j < n-1; j++)
  {
   for(int i = 0 ; i < n-j-1; i++)
   {
    if(a[i] >= a[i+1])
    {
     k = a[i];
     a[i] = a[i+1];
     a[i+1] = k;
     
     t = Res[i];
     Res[i] = Res[i+1];
     Res[i+1] = t;
    }
   }
  }
  return Res;
 }
 public void Min_Tree()//求最小生成树
 {
 
  int[] tag = new int[Weight.length];
  tag = sort();
  int i = 0;
  while(!Judge(Label))//Judge函数判断标记是否都是0
  {
   if(Label[Index_1[tag[i]]] != Label[Index_2[tag[i]]])
   {
    Result = Result + Index_1[tag[i]] +"---"+ Index_2[tag[i]] + "/n";
    if(Label[Index_1[tag[i]]] < Label[Index_2[tag[i]]])
    {
     for(int k = 0; k < Label.length; k++)
     {
      if(Label[k] == Label[Index_2[tag[i]]])
      {
       Label[k] = Label[Index_1[tag[i]]];
      }
     }
    }
    else
    {
     for(int k = 0; k < Label.length; k++)
     {
      if(Label[k] == Label[Index_1[tag[i]]])
      {
       Label[k] = Label[Index_2[tag[i]]];
      }
     }
    }
   }
   else
   {
    i = i + 1;
   }
  }
  
 }
 public boolean Judge(int[] a)//判断标记是否都是0
 {
  for(int i = 0 ;i < a.length ; i++)
  {
   if(a[i] != 0)
   {
    return false;
   }
  }
  return true;
 }
 public static void main(String[] args) //主函数
 {
  Class_Kruskal CK = new Class_Kruskal();
  CK.Min_Tree();
  System.out.println(CK.Get_Result());

 }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值