Advertisement
soulrpg

AISD_Grafy_v1

Apr 20th, 2019
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.10 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. // do listy krawedzi
  7. struct Krawedz
  8. {
  9.     // wierzcholek ktory jest poprzednikiem
  10.     int wierzcholek_p;
  11.     // wierzcholek ktory jest nastepnikiem
  12.     int wierzcholek_n;
  13. };
  14.  
  15. // do listy nastepnikow
  16. struct Nastepniki
  17. {
  18.     int wierzcholek;
  19.     int ilosc_nastepnikow = 0;
  20.     Nastepniki** tablica_nastepnikow;
  21. };
  22.  
  23. void laduj_graf(int &liczba_wierzch, int &liczba_krawedzi, Krawedz *&lista_krawedzi)
  24. {
  25.     std::string nazwa_pliku;
  26.     std::ifstream wczytaj;
  27.     std::cout << "Podaj nazwe pliku: ";
  28.     std::cin >> nazwa_pliku;
  29.     wczytaj.open(nazwa_pliku);
  30.     if(!wczytaj.good())
  31.     {
  32.         std::cout << "Blad przy otwieraniu pliku!" << std::endl;
  33.         wczytaj.close();
  34.         exit(0);
  35.     }
  36.     // wczytuje dwie pierwsze wartosci z pliku
  37.     wczytaj >> liczba_wierzch;
  38.     wczytaj >> liczba_krawedzi;
  39.     // zajmuje pamiec
  40.     lista_krawedzi = new Krawedz[liczba_krawedzi];
  41.     // wczytywanie krawedzi
  42.     for(int i = 0; i < liczba_krawedzi; i++)
  43.     {
  44.         int wartosc1, wartosc2;
  45.         wczytaj >> wartosc1;
  46.         wczytaj >> wartosc2;
  47.         if(wartosc1 > liczba_wierzch || wartosc2 > liczba_wierzch)
  48.         {
  49.             std::cout << "Podano wierzcholek o blednym kluczu!" << std::endl;
  50.             wczytaj.close();
  51.             delete lista_krawedzi;
  52.             exit(0);
  53.         }
  54.         else
  55.         {
  56.             // wykluczam istnienie grafu cyklicznego
  57.             for(int j = 0; j < i; j++)
  58.             {
  59.                 if(lista_krawedzi[j].wierzcholek_p == wartosc1 && lista_krawedzi[j].wierzcholek_n == wartosc2)
  60.                 {
  61.                     std::cout << "Blad! Wystapienie powtorne danej krawedzi!" << std::endl;
  62.                     wczytaj.close();
  63.                     delete lista_krawedzi;
  64.                     exit(0);
  65.                 }
  66.             }
  67.             for(int j = 0; j < i; j++)
  68.             {
  69.                 if(lista_krawedzi[j].wierzcholek_p == wartosc2 && lista_krawedzi[j].wierzcholek_n == wartosc1)
  70.                 {
  71.                     std::cout << "Blad! Graf jest cykliczny!" << std::endl;
  72.                     wczytaj.close();
  73.                     delete lista_krawedzi;
  74.                     exit(0);
  75.                 }
  76.             }
  77.             lista_krawedzi[i].wierzcholek_p = wartosc1;
  78.             lista_krawedzi[i].wierzcholek_n = wartosc2;
  79.         }
  80.     }
  81.     std::cout << "Wczytywanie sie powiodlo!" << std::endl;
  82.     wczytaj.close();
  83. }
  84.  
  85. void generuj_graf(int liczba_wierzcholkow, int nasycenie, Krawedz *&lista_krawedzi, int &liczba_krawedzi)
  86. {
  87.     // oblicza procent nasycenia
  88.     double mnoznik = double(nasycenie)/100;
  89.     // oblicza ilosc krawedzi jaka trzeba wygenerowac
  90.     liczba_krawedzi = ((liczba_wierzcholkow * (liczba_wierzcholkow - 1))/2)*mnoznik;
  91.     // zajmuje pamiec
  92.     lista_krawedzi = new Krawedz[liczba_krawedzi];
  93.     srand(time(0));
  94.     // generowanie krawedzi
  95.     for(int i = 0; i < liczba_krawedzi; i++)
  96.     {
  97.         int wartosc1 = rand()%liczba_wierzcholkow + 1;
  98.         int wartosc2 = wartosc1;
  99.         while(wartosc1 == wartosc2)
  100.         {
  101.             wartosc2 = rand()%liczba_wierzcholkow + 1;
  102.         }
  103.         bool czy_wstawiamy = true;
  104.         for(int j = 0; j < i; j++)
  105.         {
  106.             // warunek czy na pewno nie stworzymy cyklu w grafie
  107.             if(lista_krawedzi[j].wierzcholek_p == wartosc2 && lista_krawedzi[j].wierzcholek_n == wartosc1)
  108.             {
  109.                czy_wstawiamy = false;
  110.                i--;
  111.             }
  112.             // warunek czy na pewno juz dana krawedz nie istnieje
  113.             else if(lista_krawedzi[j].wierzcholek_p == wartosc1 && lista_krawedzi[j].wierzcholek_n == wartosc2)
  114.             {
  115.                 czy_wstawiamy = false;
  116.                 i--;
  117.             }
  118.         }
  119.         if(czy_wstawiamy == true)
  120.         {
  121.             lista_krawedzi[i].wierzcholek_p = wartosc1;
  122.             lista_krawedzi[i].wierzcholek_n = wartosc2;
  123.         }
  124.     }
  125.     std::cout << "Generowanie grafu przebieglo pomyslnie!" << std::endl;
  126. }
  127.  
  128. // NIE JESTEM PEWNY CZY TO W PELNI DZIALA
  129. void krawedzie_do_nastepniki(int liczba_wierzcholkow, int liczba_krawedzi, Krawedz lista_krawedzi[], Nastepniki *&lista_nastepnikow)
  130. {
  131.     lista_nastepnikow = new Nastepniki[liczba_wierzcholkow];
  132.     for(int i = 0; i < liczba_wierzcholkow; i++)
  133.     {
  134.         lista_nastepnikow[i].wierzcholek = i+1;
  135.     }
  136.     for(int i = 0; i < liczba_krawedzi; i++)
  137.     {
  138.         // tymczasowa tablica do podmiany
  139.         Nastepniki** tmp_tablica = new Nastepniki*[lista_nastepnikow[lista_krawedzi[i].wierzcholek_p - 1].ilosc_nastepnikow];
  140.         // zwieksza o jeden ilosc nastepnikow dla danego wierzcholka na liscie nastepnikow
  141.         lista_nastepnikow[lista_krawedzi[i].wierzcholek_p - 1].ilosc_nastepnikow++;
  142.         //std::cout << "PO ZWIEKSZENIU LICZBY NASTEPNIKOW" << std::endl;
  143.         for(int j = 0; j < lista_nastepnikow[lista_krawedzi[i].wierzcholek_p - 1].ilosc_nastepnikow - 1; j++)
  144.         {
  145.             //std::cout << "CZY TU WYWALA?" << std::endl;
  146.             tmp_tablica[j] = lista_nastepnikow[lista_krawedzi[i].wierzcholek_p - 1].tablica_nastepnikow[j];
  147.         }
  148.         //std::cout << "PO PRZEPISANIU DO TMP" << std::endl;
  149.         // alokoawnie tablica_nastepnikow od nowa (nie wiem co sie dzieje z tymi wartosciami co tam byly wczesniej)
  150.         //std::cout << lista_nastepnikow[lista_krawedzi[i].wierzcholek_p - 1].tablica_nastepnikow << std::endl;
  151.         //delete [] lista_nastepnikow[lista_krawedzi[i].wierzcholek_p - 1].tablica_nastepnikow;
  152.         //std::cout << "CZY TU?" << std::endl;
  153.         lista_nastepnikow[lista_krawedzi[i].wierzcholek_p - 1].tablica_nastepnikow = new Nastepniki*[lista_nastepnikow[lista_krawedzi[i].wierzcholek_p - 1].ilosc_nastepnikow];
  154.         //std::cout << "PO TU?" << std::endl;
  155.         // przepisywanie starych wskaznikow
  156.         for(int j = 0; j < lista_nastepnikow[lista_krawedzi[i].wierzcholek_p - 1].ilosc_nastepnikow - 1; j++ )
  157.         {
  158.             lista_nastepnikow[lista_krawedzi[i].wierzcholek_p - 1].tablica_nastepnikow[j] = tmp_tablica[j];
  159.         }
  160.         // dodawanie nowego wskaznika
  161.         lista_nastepnikow[lista_krawedzi[i].wierzcholek_p - 1].tablica_nastepnikow[lista_nastepnikow[lista_krawedzi[i].wierzcholek_p - 1].ilosc_nastepnikow - 1] = &lista_nastepnikow[lista_krawedzi[i].wierzcholek_n - 1];
  162.         delete [] tmp_tablica;
  163.     }
  164.     std::cout << "Stworzenie listy nastepnikow przebieglo pomyslnie!" << std::endl;
  165. }
  166.  
  167. void krawedzie_do_macierz(int liczba_wierzcholkow, int liczba_krawedzi, Krawedz lista_krawedzi[], int**& macierz_sasiedztwa)
  168. {
  169.     // tworzymy pusta macierz sasiedztwa wypelniona zerami
  170.     macierz_sasiedztwa = new int*[liczba_wierzcholkow];
  171.     for(int i = 0; i < liczba_wierzcholkow; i++)
  172.     {
  173.         macierz_sasiedztwa[i] = new int[liczba_wierzcholkow];
  174.     }
  175.     for(int i = 0; i < liczba_wierzcholkow; i++)
  176.     {
  177.         for(int j = 0; j < liczba_wierzcholkow; j++)
  178.         {
  179.             macierz_sasiedztwa[i][j] = 0;
  180.         }
  181.     }
  182.     // wstawiamy jedynki w odpowiednich miejscach krawedzi
  183.     for(int i = 0; i < liczba_krawedzi; i++)
  184.     {
  185.         macierz_sasiedztwa[lista_krawedzi[i].wierzcholek_p - 1][lista_krawedzi[i].wierzcholek_n - 1] = 1;
  186.     }
  187.     std::cout << "Stworzenie macierzy sasiedztwa przebieglo pomyslnie!" << std::endl;
  188. }
  189.  
  190. // funkcje testowe sluzace do wyswietlania grafu w roznych reprezentacjach
  191. void wyswietl_graf(int liczba_krawedzi, Krawedz lista_krawedzi[])
  192. {
  193.     for(int i = 0; i < liczba_krawedzi; i++)
  194.     {
  195.         std::cout << "[" << i << "]: " << lista_krawedzi[i].wierzcholek_p << " -> " << lista_krawedzi[i].wierzcholek_n << std::endl;
  196.     }
  197. }
  198.  
  199. void wyswietl_graf_2(int liczba_wierzcholkow, Nastepniki lista_nastepnikow[])
  200. {
  201.     for(int i = 0; i < liczba_wierzcholkow; i++)
  202.     {
  203.         std::cout << "[" << i << "]: " << lista_nastepnikow[i].wierzcholek;
  204.         for(int j = 0; j < lista_nastepnikow[i].ilosc_nastepnikow; j++)
  205.         {
  206.            std::cout << " -> " << lista_nastepnikow[i].tablica_nastepnikow[j]->wierzcholek;
  207.         }
  208.         std::cout << std::endl;
  209.     }
  210. }
  211.  
  212. void wyswietl_graf_3(int liczba_wierzcholkow, int** macierz_sasiedztwa)
  213. {
  214.     for(int i = 0; i < liczba_wierzcholkow; i++)
  215.     {
  216.         for(int j = 0; j < liczba_wierzcholkow; j++)
  217.         {
  218.             std::cout << macierz_sasiedztwa[i][j] << "\t";
  219.         }
  220.         std::cout << std::endl;
  221.     }
  222. }
  223.  
  224.  
  225.  
  226. int main()
  227. {
  228.     int wybor;
  229.     int liczba_wierzch = 0;
  230.     int liczba_krawedzi = 0;
  231.     int nasycenie = 0;
  232.     struct Krawedz* lista_krawedzi;
  233.     struct Nastepniki* lista_nastepnikow;
  234.     int** macierz_sasiedztwa;
  235.     while(wybor != 1 && wybor != 2)
  236.     {
  237.         std::cout << "1)Laduj graf z pliku, 2)Generuj graf: ";
  238.         std::cin >> wybor;
  239.         if(!std::cin)
  240.         {
  241.             std::cout << "Podano zle dane wejsciowe!" << std::endl;
  242.             exit(0);
  243.         }
  244.     }
  245.     if(wybor == 1)
  246.     {
  247.         laduj_graf(liczba_wierzch, liczba_krawedzi, lista_krawedzi);
  248.     }
  249.     else
  250.     {
  251.         std::cout << "Podaj liczbe wierzcholkow grafu: ";
  252.         std::cin >> liczba_wierzch;
  253.         if(!std::cin || liczba_wierzch <= 0)
  254.         {
  255.             std::cout << "Podano zle dane wejsciowe!" << std::endl;
  256.             exit(0);
  257.         }
  258.         std::cout << "Podaj poziom nasycenia grafu (1-100%): ";
  259.         std::cin >> nasycenie;
  260.         if(!std::cin || nasycenie < 1 || nasycenie > 100)
  261.         {
  262.             std::cout << "Podano zle dane wejsciowe!" << std::endl;
  263.             exit(0);
  264.         }
  265.         generuj_graf(liczba_wierzch, nasycenie, lista_krawedzi, liczba_krawedzi);
  266.     }
  267.     wyswietl_graf(liczba_krawedzi, lista_krawedzi);
  268.     krawedzie_do_nastepniki(liczba_wierzch, liczba_krawedzi, lista_krawedzi, lista_nastepnikow);
  269.     wyswietl_graf_2(liczba_wierzch, lista_nastepnikow);
  270.     krawedzie_do_macierz(liczba_wierzch, liczba_krawedzi, lista_krawedzi, macierz_sasiedztwa);
  271.     wyswietl_graf_3(liczba_wierzch, macierz_sasiedztwa);
  272.     delete [] *macierz_sasiedztwa;
  273.     delete [] lista_krawedzi;
  274.     delete [] lista_nastepnikow;
  275.     return 0;
  276. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement