codisinmyvines

kruskal

Nov 12th, 2020
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. #include <iostream>
  2. using std::cout;
  3. using std::cin;
  4.  
  5. struct graph
  6. {
  7.     int n; //номер вершины
  8.     int weight; //вес вершины
  9.     graph* next;
  10. };
  11. void vvodgraph(graph*& head, int l)
  12. {
  13.     int i, k;
  14.     head = NULL;
  15.     cout << "Введите количество инцидентных вершин для вершины " << l << "\n";
  16.     cin >> k;
  17.     cout << "Введите номер вершины и его вес.\n";
  18.     for (i = 0; i < k; i++)
  19.     {
  20.         graph* q = new graph;
  21.         cin >> q->n >>q->weight;
  22.         q->next = head;
  23.         head = q;
  24.     }
  25. }
  26. int kolvomin(graph* head)
  27. {
  28.     graph* q = head;
  29.     int k = 0, min;
  30.     min = q->weight;
  31.     q = q->next;
  32.     while (q != NULL)
  33.     {
  34.         if (q->weight <= min)
  35.         {
  36.             min = q->weight;
  37.             k++;
  38.         }
  39.         q = q->next;
  40.     }
  41.     return k;
  42. }
  43. graph** ostov(graph** v, int*& color, int n)
  44. {
  45.     graph** ost = new graph * [n];
  46.     int i, min, k, j;
  47.     for (i = 0; i < n; i++)
  48.     {
  49.         graph* q = v[i];
  50.         k = kolvomin(v[i]);
  51.         graph** m = new graph*[k];
  52.         min = q->weight;
  53.         //q = q->next;
  54.         j = 0;
  55.         ost[i] = NULL;
  56.         graph* miin = q;
  57.         while (q != NULL)
  58.         {
  59.             if (q->weight <= min)
  60.             {
  61.                 min = q->weight;
  62.                 miin = q;
  63.             }
  64.             q = q->next;
  65.         }
  66.         q = v[i];
  67.         while (q != NULL)
  68.         {
  69.             if (q->weight == miin->weight)
  70.             {
  71.                 m[j] = q;
  72.                 j++;
  73.             }
  74.             q = q->next;
  75.         }
  76.         for (j = 0; j < k; j++)
  77.         {
  78.             if (color[i] != color[m[j]->n-1])
  79.             {
  80.                 graph* l = new graph;
  81.                 l->n = m[j]->n;
  82.                 l->weight = m[j]->weight;
  83.                 l->next = ost[i];
  84.                 ost[i] = l;
  85.                 color[m[j]->n - 1] = color[i];
  86.             }
  87.         }
  88.     }
  89.     return ost;
  90. }
  91. void showgraph(graph* head)
  92. {
  93.     graph* q = head;
  94.     while (q != NULL)
  95.     {
  96.         cout << q->n << " ";
  97.         q = q->next;
  98.     }
  99.     cout << "\n";
  100. }
  101. void deletegraph(graph*& head)
  102. {
  103.     graph* q = head;
  104.     while (head != NULL)
  105.     {
  106.         q = head;
  107.         head = head->next;
  108.         delete q;
  109.     }
  110. }
  111. int main()
  112. {
  113.     setlocale(LC_ALL, "RU");
  114.     int i, n;
  115.     cout << "Граф задается в виде структуры смежности.\n";
  116.     cout << "Введите количество вершин в графе: \n";
  117.     cin >> n;
  118.     graph** v = new graph*[n];
  119.     for (i = 0; i < n; i++)
  120.         vvodgraph(v[i], i + 1);
  121.     int* color = new int[n];
  122.     for (i = 0; i < n; i++)
  123.         color[i] = i;
  124.     graph** ost = ostov(v, color, n);
  125.     for (i = 0; i < n; i++)
  126.         showgraph(ost[i]);
  127.     for (i = 0; i < n; i++)
  128.         deletegraph(v[i]);
  129.     delete[]v;
  130.     for (i = 0; i < n; i++)
  131.         deletegraph(ost[i]);
  132.     delete[]ost;
  133.  
  134.     return 0;
  135. }
Advertisement
Add Comment
Please, Sign In to add comment