Kruskal 算法实现

x33g5p2x  于2022-07-11 转载在 其他  
字(1.2k)|赞(0)|评价(0)|浏览(361)

一 构建后的图

二 代码

  1. package graph.kruskal;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.List;
  5. import java.util.Scanner;
  6. public class Kruskal {
  7. static final int N = 100;
  8. static int fa[] = new int[N];
  9. static int n;
  10. static int m;
  11. static Edge e[] = new Edge[N * N];
  12. static List<Edge> edgeList = new ArrayList();
  13. static {
  14. for (int i = 0; i < e.length; i++) {
  15. e[i] = new Edge();
  16. }
  17. }
  18. // 初始化集合号为自身
  19. static void Init(int n) {
  20. for (int i = 1; i <= n; i++)
  21. fa[i] = i;
  22. }
  23. // 合并
  24. static int Merge(int a, int b) {
  25. int p = fa[a];
  26. int q = fa[b];
  27. if (p == q) return 0;
  28. for (int i = 1; i <= n; i++) { // 检查所有结点,把集合号是 q 的改为 p
  29. if (fa[i] == q)
  30. fa[i] = p; // a 的集合号赋值给 b 集合号
  31. }
  32. return 1;
  33. }
  34. // 求最小生成树
  35. static int Kruskal(int n) {
  36. int ans = 0;
  37. Collections.sort(edgeList);
  38. for (int i = 0; i < m; i++)
  39. if (Merge(edgeList.get(i).u, edgeList.get(i).v) == 1) {
  40. ans += edgeList.get(i).w;
  41. n--;
  42. if (n == 1)//n-1次合并算法结束
  43. return ans;
  44. }
  45. return 0;
  46. }
  47. public static void main(String[] args) {
  48. Scanner scanner = new Scanner(System.in);
  49. n = scanner.nextInt();
  50. m = scanner.nextInt();
  51. Init(n);
  52. for (int i = 1; i <= m; i++) {
  53. e[i].u = scanner.nextInt();
  54. e[i].v = scanner.nextInt();
  55. e[i].w = scanner.nextInt();
  56. edgeList.add(e[i]);
  57. }
  58. System.out.println("最小的花费是:" + Kruskal(n));
  59. }
  60. }
  61. class Edge implements Comparable {
  62. int u;
  63. int w;
  64. int v;
  65. @Override
  66. public int compareTo(Object o) {
  67. if (this.w > ((Edge) o).w) {
  68. return 1;
  69. } else if (this.w == ((Edge) o).w) {
  70. return 0;
  71. } else {
  72. return -1;
  73. }
  74. }
  75. }

三 测试

绿色为输入,白色为输出。

相关文章