Prime 算法实现

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

一 构建后的图

二 实现

  1. package graph.prim;
  2. import java.util.Scanner;
  3. public class Prim {
  4. static final int INF = 0x3f3f3f3f;
  5. static final int N = 100;
  6. // 如果s[i]=true,说明顶点i已加入U
  7. static boolean s[] = new boolean[N];
  8. static int c[][] = new int[N][N];
  9. static int closest[] = new int[N];
  10. static int lowcost[] = new int[N];
  11. static void Prim(int n) {
  12. // 初始时,集合中 U 只有一个元素,即顶点 1
  13. s[1] = true;
  14. for (int i = 1; i <= n; i++) {
  15. if (i != 1) {
  16. lowcost[i] = c[1][i];
  17. closest[i] = 1;
  18. s[i] = false;
  19. } else
  20. lowcost[i] = 0;
  21. }
  22. for (int i = 1; i < n; i++) {
  23. int temp = INF;
  24. int t = 1;
  25. // 在集合中 V-u 中寻找距离集合U最近的顶点t
  26. for (int j = 1; j <= n; j++) {
  27. if (!s[j] && lowcost[j] < temp) {
  28. t = j;
  29. temp = lowcost[j];
  30. }
  31. }
  32. if (t == 1)
  33. break; // 找不到 t,跳出循环
  34. s[t] = true; // 否则,t 加入集合U
  35. for (int j = 1; j <= n; j++) { // 更新 lowcost 和 closest
  36. if (!s[j] && c[t][j] < lowcost[j]) {
  37. lowcost[j] = c[t][j];
  38. closest[j] = t;
  39. }
  40. }
  41. }
  42. }
  43. public static void main(String[] args) {
  44. int n, m, u, v, w;
  45. Scanner scanner = new Scanner(System.in);
  46. n = scanner.nextInt();
  47. m = scanner.nextInt();
  48. int sumcost = 0;
  49. for (int i = 1; i <= n; i++)
  50. for (int j = 1; j <= n; j++)
  51. c[i][j] = INF;
  52. for (int i = 1; i <= m; i++) {
  53. u = scanner.nextInt();
  54. v = scanner.nextInt();
  55. w = scanner.nextInt();
  56. c[u][v] = c[v][u] = w;
  57. }
  58. Prim(n);
  59. System.out.println("数组lowcost:");
  60. for (int i = 1; i <= n; i++)
  61. System.out.print(lowcost[i] + " ");
  62. System.out.println();
  63. for (int i = 1; i <= n; i++)
  64. sumcost += lowcost[i];
  65. System.out.println("最小的花费:" + sumcost);
  66. }
  67. }

三 测试

相关文章