Алгоритм Прима не работает на неполных графах - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Помогите, пожалуйста, с реализацией алгоритма Прима (алгоритм построения остова минимального веса). В данном примере вес остова должен получится 15, а получается 20. Суть Алгоритма Прима: Алгоритм состоит из N-1 итерации, на каждой из которой к дереву добавляется ровно одно ребро, не нарушающее свойства дерева (т.е. один конец добавляемого ребра принадлежит дереву, а другой - не принадлежит). Ключевой момент - из всех таких рёбер каждый раз выбирается ребро с минимальным весом. На полных графах данный алгоритм работает корректно, а вот на не полных нет. Не могу найти ошибку.
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace ConsoleApplication3
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. int n = 4;//количество вершин
  12. float[,] a, a1;//матрицы весов графа и его остова
  13. float[] used = new float[n]; //Массив использованных вершин
  14. short i, j;
  15. int count = 0;
  16. float s1 = 0;//вес остова
  17. a = new float[n, n];
  18. a1 = new float[n, n];
  19.  
  20. a[0, 0] = 0;
  21. a[0, 1] = 11;
  22. a[0, 2] = 2;
  23. a[0, 3] = 0;
  24. a[1, 0] = 11;
  25. a[1, 1] = 0;
  26. a[1, 2] = 6;
  27. a[1, 3] = 0;
  28. a[2, 0] = 2;
  29. a[2, 1] = 6;
  30. a[2, 2] = 0;
  31. a[2, 3] = 7;
  32. a[3, 0] = 0;
  33. a[3, 1] = 6;
  34. a[3, 2] = 7;
  35. a[3, 3] = 0;
  36. for (i = 0; i < n; i++)
  37. {
  38. used[i] = 0;
  39. for (j = 0; j < n; j++)
  40. a1[i, j] = 0;
  41. }
  42. used[0] = 1;
  43. while (count < n - 1)
  44. {
  45. float min = 100000;
  46. for (i = 0; i < n; i++)
  47. {
  48. if (used[i] != 0)
  49. {
  50. for (j = 0; j < n; j++)
  51. {
  52. if ((a[i, j] < min) & (a[i, j] != 0) & (used[j]) == 0)
  53. min = a[i, j];
  54. }
  55. }
  56. for (int k = 0; k < n; k++)
  57. {
  58. for (j = 0; j < n; j++)
  59. {
  60. if ((a[k, j] == min) & (used[j] == 0))
  61. {
  62. used[j] = 1;
  63. a1[k, j] = a1[j, k] = min;
  64. s1 = s1 + a1[j, k];
  65. k = n;
  66. count = count + 1;
  67. break;
  68. }
  69. }
  70. }
  71. }
  72. }
  73. for (i = 0; i < n; i++)
  74. {
  75. Console.WriteLine(" \n");
  76. for (j = 0; j < n; j++)
  77. Console.WriteLine(a[i, j]);
  78. }
  79. Console.WriteLine("Вес остова ="+s1);
  80. }
  81.  
  82. }
  83. }

Решение задачи: «Алгоритм Прима не работает на неполных графах»

textual
Листинг программы
  1.  
  2.             for (i = 0; i < n; i++)
  3.             {
  4.                 used[i] = 0;
  5.                 for (j = 0; j < n; j++)
  6.                     a1[i, j] = 0;
  7.             }
  8.  
  9.             used[0] = 1;
  10.  
  11.             while (count < n - 1)
  12.             {
  13.                 float min = 100000;
  14.                 for (i = 0; i < n; i++)
  15.                 {
  16.                     if (used[i] != 0)
  17.                     {
  18.                         for (j = 0; j < n; j++)
  19.                         {
  20.                             if ((a[i, j] < min) & (a[i, j] != 0) & (used[j]) == 0)
  21.                            
  22.                                 min = a[i, j];
  23.                                
  24.                         }
  25.  
  26.                     }
  27.                 } //не хватало этой скобки

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы