首页 > 代码库 > 最小生成树之kruskal方法实现 (java)
最小生成树之kruskal方法实现 (java)
今天是个阴天,下了点雨,work .........
步骤:将所有边排序,然后不断从小到大加上边,这个过程最重要的是避免环的产生,此处用并查集。(nyoj 38)
1 package 最小生成树; 2 3 import java.util.Arrays; 4 import java.util.Scanner; 5 class Node implements Comparable<Node> 6 { 7 int x; 8 int y; 9 int val; 10 public Node(int x,int y,int val) 11 { 12 this.x=x; 13 this.y=y; 14 this.val=val; 15 } 16 @Override 17 public int compareTo(Node o) { 18 return this.val-o.val; 19 } 20 21 22 } 23 24 public class Main { 25 26 public static void init(int a[])//并查集初始化,用来判断是否有环 27 { 28 for(int i=1;i<a.length;i++)a[i]=i; 29 30 } 31 public static int find(int a[],int x) //查找节点的父亲,没有优化的方法 32 { 33 while(a[x]!=x) 34 { 35 x=a[x]; 36 } 37 38 return x; 39 } 40 public static boolean union(int a[],int x,int y)//union一条边 41 { 42 int fx=find(a, x); 43 int fy=find(a, y); 44 if(fx!=fy) 45 { 46 a[fx]=fy; 47 return true; //成功加入 48 49 } 50 return false;//成环 51 52 } 53 54 public static void main(String[] args) { 55 // TODO Auto-generated method stub 56 Scanner scn=new Scanner(System.in); 57 int len=scn.nextInt(); 58 while(len-->0) 59 { 60 int ans=0;//保存最后的答案 61 int v=scn.nextInt(); 62 int e=scn.nextInt(); 63 Node n[]=new Node[e]; 64 for(int i=0;i<e;i++) 65 { 66 n[i]=new Node(scn.nextInt(),scn.nextInt(),scn.nextInt()); 67 68 69 } 70 71 Arrays.sort(n); 72 //并查集的初始化 73 int father[]=new int[v+1]; 74 init(father); 75 int index=0; 76 for(int i=0;i<e;i++) 77 { 78 if(union(father, n[i].x,n[i].y)) 79 { 80 81 index++; //没成环,加入这条边 82 ans+=n[i].val; 83 84 85 } 86 if(index==v-1) 87 { 88 break; 89 } 90 91 92 93 } 94 int min=scn.nextInt(); 95 96 for(int j=1;j<v;j++) 97 { 98 int temp=scn.nextInt(); 99 if(min>temp) min=temp;100 101 }102 System.out.println(ans+min);103 104 }105 106 }107 108 109 110 111 }
最小生成树之kruskal方法实现 (java)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。