Advertisement
Guest User

Monique

a guest
Nov 22nd, 2011
582
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.54 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <malloc.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <ctime>
  7. #include <algorithm>
  8. #include <time.h>
  9. #include <vector>
  10. #include <map>
  11.  
  12. using namespace std;
  13.  
  14. class Krawedz
  15. {
  16.     public:
  17.         int stad;
  18.         int dokad;
  19.         int waga;
  20. };
  21.  
  22. int AlgorytmKruskala(int n, Krawedz **K1, Krawedz **K2 )
  23. {
  24.  
  25.     int *A = (int*)malloc(sizeof(int) * (n + 3));
  26.     //vector<int> B(0);
  27.     int  j, k, u, v, w;
  28.     int suma = 0;
  29.  
  30.     std::fill_n(A + 1, n, 0);
  31.  
  32.     k = 1;
  33.     j = 1;
  34.     while (k < n)
  35.     {
  36.         u = (*K1)[j].stad;
  37.         v = (*K1)[j].dokad;
  38.         j++;
  39.         if ( A[u] == 0 || A[v] == 0 || A[u] != A[v] )
  40.         {
  41.             suma++;
  42.             (*K2)[suma] = (*K1)[j - 1];
  43.             if ( A[u] == 0 && A[v] != 0 )
  44.             {
  45.                 w = u;
  46.                 u = v;
  47.                 v = w;
  48.             }
  49.             if (A[u] == 0) A[u] = u;
  50.  
  51.             if (A[v] == 0) A[v] = A[u];
  52.             else
  53.             {
  54.                 w = A[v];
  55.                 for (int i = 1; i <= n; i++)
  56.                     if (A[i] == w ) A[i] = A[u];
  57.             }
  58.             k++;
  59.         }
  60.     }
  61.  
  62.     delete A;
  63.     return suma;
  64. }
  65.  
  66. bool operator < (const Krawedz &a, const Krawedz &b)
  67. {
  68.     return a.waga < b.waga;
  69. }
  70.  
  71. int Porownaj(const void *a, const void *b)
  72. {
  73.    Krawedz *c = (Krawedz*)a;
  74.    Krawedz *d = (Krawedz*)b;
  75.    if (c -> waga < d -> waga) return -1;
  76.    else if (c -> waga == d -> waga) return 0;
  77.    else return 1;
  78. }
  79.  
  80. int main()
  81. {
  82.     int n, k, suma, p, a = 0, y, x;
  83.  
  84.     srand((unsigned)time(NULL));
  85.  
  86.     cout << endl << endl << endl;
  87.     cout << "\t..:: MODELOWANIE GRAFOW - ALGORYTM AlgorytmKruskalaA ::.." << endl;
  88.     cout << "\t\tMonika Kosinska, 165060" << endl << endl;
  89.     cout << "\t\tPodaj liczbe wierzcholkow: ";
  90.     cin >> n;
  91.     cout << endl;
  92.     cout << "\t\tPodaj procentowa (%) ilosc krawedzi: ";
  93.     cin >> k;
  94.     cout << endl << endl;
  95.  
  96.     p = n * (n - 1) / 2 * k / 100;
  97.  
  98.     //Krawedz *K1 = (Krawedz*)malloc((p + 3)* sizeof(Krawedz));
  99.     //Krawedz *K2 = (Krawedz*)malloc((p + 3)* sizeof(Krawedz));
  100.     Krawedz* K1 = new Krawedz;
  101.     Krawedz* K2 = new Krawedz;
  102.  
  103.      //osoba* czlowiek1 = new osoba;
  104.  
  105.     for (int i = 1; i <= n - 1; i++)
  106.     {
  107.         K1[i].stad = i;
  108.         K1[i].dokad = i + 1;
  109.         K1[i].waga = 1 + rand() % 10;
  110.     }
  111.     for (int i = n; i <= p;)
  112.     {
  113.         int q=0;
  114.         y = 1 + rand() % (n);
  115.         x = 1 + rand() % (n);
  116.         if (x != y)
  117.         {
  118.             for (int j = 1; j <= p; j++)
  119.             {
  120.  
  121.                 if (K1[j].stad == x)
  122.                     if (K1[j].dokad == y)
  123.                     {
  124.                         q = 1;
  125.                     }
  126.                 if (K1[j].stad == y)
  127.                     if (K1[j].dokad == x)
  128.                     {
  129.                         q = 1;
  130.                     }
  131.             }
  132.  
  133.             if (q == 0)
  134.             {
  135.                 K1[i].stad = x;
  136.                 K1[i].dokad = y;
  137.                 K1[i + 1].stad = y; // gdy skierowany//
  138.                 K1[i + 1].dokad = x;//
  139.                 K1[i].waga = 1 + rand() % 9;
  140.                 K1[i + 1].waga = K1[i].waga;//
  141.                 i++;
  142.             }
  143.         }
  144.     }
  145.  
  146.     cout << endl << endl << "\t\t\t MOJ WYGENEROWANY GRAF: " << endl << endl;
  147.  
  148.     for(int i = 1; i <= p; i++)
  149.     {
  150.         cout << "\t\t\t" << K1[i].stad << " -> " << K1[i].dokad << ": " << K1[i].waga << endl;
  151.     }
  152.  
  153.  
  154.     //trzeba policzyc czas trwania AlgorytmKruskalaa******************************
  155.  
  156.     clock_t StartTime, StopTime; //potrzebne dane do liczenia czasu trwania - bibloteka ctime
  157.  
  158.     StartTime = clock(); //uruchamiam zegar
  159.  
  160.     qsort(&K1, p, sizeof(Krawedz), Porownaj);
  161.  
  162.     suma = AlgorytmKruskala(n, &K1, &K2 );
  163.  
  164.     StopTime = clock(); //zatrzymuje zegar
  165.  
  166.     double czas = 0;
  167.  
  168.     czas = (StopTime - StartTime) /  (double) CLOCKS_PER_SEC; //licze czas
  169.  
  170.     //*********************************************************************
  171.  
  172.     int pom = 0;
  173.  
  174.     cout << endl << endl << "\t\t\tNAJKROTSZA DROGA W TYM GRAFIE TO: " << endl << endl;
  175.  
  176.     for (int i = 1; i <= suma; i++)
  177.     {
  178.         cout << "\t\t\t" << K2[i].stad << " -> " << K2[i].dokad << " : " << K2[i].waga << endl;
  179.         pom += K2[i].waga;
  180.     }
  181.     cout << endl << endl << "\t\t\t\t" << "Wartość MST:  " << pom << endl;
  182.     cout << endl << endl << "\t\t\t\t" << "Czas trwania AlgorytmKruskalaa: " << czas << "[s]" << endl << endl << "\t\t\t\t";
  183.     delete K1;
  184.     delete K2;
  185. }
  186.  
  187.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement