Advertisement
Guest User

Untitled

a guest
May 27th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.00 KB | None | 0 0
  1. void Graph::Prim_matrix()
  2. {
  3.     Edge *edg = new Edge[edges];            // posortowana rosnąco wzg wag tablica krawędzi
  4.     Edge *mst = new Edge[vertices-1];       // krawędzie MST
  5.     int mst_i = 0;                          // indeks tablicy mst
  6.     int edg_i = 0,
  7.         vert = first_vert;
  8.     bool *processed = new bool[vertices];   // tablica przetworzonych wierzcholkow
  9.     for (int i = 0; i < vertices; i++)
  10.         processed[i] = false;               // zaden nie jest przetworzony
  11.     processed[vert] = true;                 // tylko pierwszy
  12.     for (int i = 0; i < vertices - 1; i++)
  13.     {
  14.         for (int j = 0; j < vertices; j++)
  15.         {
  16.             if (matrix->tab[vert][j] >= 0 && !processed[j])
  17.             {
  18.                 edg[edg_i].first_vert = vert;
  19.                 edg[edg_i].second_vert = j;
  20.                 edg[edg_i].weight = matrix->tab[vert][j];
  21.                 edg[edg_i].processed = false;
  22.                 edg_i++;
  23.             }
  24.         }
  25.         //cout << "no:\n";
  26.         //for (int i = 0; i < edges; i++)
  27.         //  if(!edg[i].processed)
  28.         //      cout << edg[i].first_vert << "-" << edg[i].second_vert << ": " << edg[i].weight <<"\n";
  29.  
  30.         edg->quickSort(edg, 0, edges);
  31.         //cout << "sorted:\n";
  32.  
  33.         //for (int j = 0; j < edges; j++)
  34.         //  if (!edg[j].processed)
  35.         //      cout << edg[j].first_vert << "-" << edg[j].second_vert << ": " << edg[j].weight << "\n";
  36.  
  37.         for (int k = 0; k < edges; k++)
  38.         {
  39.             if (!edg[k].processed && !(processed[edg[k].first_vert] && processed[edg[k].second_vert]))
  40.             {
  41.                 mst[mst_i] = edg[k];
  42.                 edg[k].processed = true;
  43.  
  44.                 vert = edg[k].second_vert;
  45.  
  46.                 processed[edg[k].first_vert] = true;
  47.                 processed[edg[k].second_vert] = true;
  48.                 mst_i++;
  49.                 break;
  50.             }
  51.         }
  52.         //cout << "processed: \n";
  53.         //for (int i = 0; i < vertices - 1; i++)
  54.         //{
  55.         //  printf("%2d|%2d\n",i, processed[i]);
  56.         //}
  57.  
  58.     }
  59.     cout << "Algorytm Prima - Macierzowo: \n";
  60.     cout << "  EDGE  : WEIGHT\n";
  61.     int sum = 0;
  62.     for (int i = 0; i < vertices - 1; i++)
  63.     {
  64.         printf("(%2d-%-2d) : %2d\n", mst[i].first_vert, mst[i].second_vert, mst[i].weight);
  65.         sum += mst[i].weight;
  66.     }
  67.     cout << "    Sum = " << sum << "\n\n";
  68.     delete[] edg;
  69.     delete[] mst;
  70.     delete[] processed;
  71. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement