Advertisement
Guest User

Monique

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