Facebook
From Harmless Dolphin, 5 Years ago, written in C++.
Embed
Download Paste or View Raw
Hits: 240
  1. #include <iostream>
  2. #include <ctime>
  3. #include <fstream>
  4. #include <cstdlib>
  5. //#include <windows.h>
  6. #include "Main.h"
  7.  
  8. using namespace std;
  9.  
  10. int main()
  11. {
  12.         int n,l;
  13.  
  14.         //Wczytujemy liczbe krawedzi i wierzchlkow
  15.         cout<<"Podaj liczbe wierzcholkow: "; cin>>n;
  16.         cout<<"Podaj liczbe krawedzi: "; cin>>l;
  17.        
  18.         //Sprawdzamy czy moza w ogole zrobic graf
  19.         if(n*(n-1)/2 < l)
  20.         {
  21.                 cout<<"Zbyt duza ilosc krawedzi!\n";
  22.                 exit(1);
  23.         }
  24.         if(l < n -1 || l == 0 || n == 0)
  25.         {
  26.                 cout<<"Nie da sie wygenerowac spojnego grafu :(\n";
  27.                 exit(-1);
  28.         }
  29.  
  30.         Graf graf(n);
  31.         int skladowa = 0;
  32.         int krawedz;
  33.  
  34.         srand(time(NULL));
  35.  
  36.         //Macierz sasiedztwa
  37.         int **MS = new int *[n];
  38.         for(int i = 0; i < n; i++)
  39.         {
  40.                 MS[i] = new int [n];
  41.         }
  42.         //Dopoki graf nie jest spojny
  43.         //losowo ustaiwmy macierz sasiedztwa
  44.         while(skladowa != 1)
  45.         {
  46.                 for(int i = 0; i < n; i++)
  47.                 {
  48.                         for(int j = 0; j < n; j++)
  49.                         MS[i][j] = 0;
  50.                 }
  51.                 krawedz = l;
  52.                 while(krawedz)
  53.                 {
  54.                         int k1 = rand() % n;
  55.                         int k2 = rand() % n;
  56.                         while (k1 == k2 || MS[k1][k2] == 1)
  57.                         {
  58.                                 k1 = rand() % n;
  59.                                 k2 = rand() % n;
  60.                         }
  61.                         MS[k1][k2] = 1;
  62.                         MS[k2][k1] = 1;
  63.                         krawedz--;     
  64.                 }
  65.                 //Algorytm sprawdzajacy spojna skladowa
  66.                 //Zwolnij() usuwa dane z pamieci gdyby cos zostalo (w poprzedniej
  67.                 //iteracji skladowa != 1)
  68.                 skladowa = 0;
  69.                 graf.Zwolni();
  70.                 //Ustaiwa graf wedlug danych z macierzy sasiedztwa
  71.                 graf.UstawGraf(MS,n);
  72.                 //Przygotowuje wierzcholki pod sprawdzanie spojnej skladowej
  73.                 graf.UstawNieodwiedzone();
  74.  
  75.                 //Tu sprawdzamy
  76.                 for(int i = 0; i < n; i++)
  77.                 {
  78.                         if(graf.CzyOdwiedzony(i) == -1)
  79.                         {
  80.                                 skladowa++;
  81.                                 graf.DFS(i,skladowa);
  82.                         }
  83.                 }
  84.  
  85.         }
  86.  
  87.         cout<<"\nMACIERZ SASIEDZTWA\n";
  88.          for(int i = 0; i < n; i++)
  89.          {
  90.                 for(int j = 0; j < n; j++)
  91.                         cout<<MS[i][j]<<"  ";
  92.                 cout<<endl;
  93.          }
  94.  
  95.  
  96.          //Numerujemy wierzcholki
  97.          graf.Ponumeruj();
  98.  
  99.          //Tworzymy macierz incydencji i przypisujemy losowe wagi kazdej krawedzi
  100.          int **MI;
  101.          S_to_L_to_I(MS,n,MI);
  102.          for(int i = 0; i < n; i++)
  103.          {
  104.                 for(int j = 0; j < l; j++)
  105.                 {
  106.                         cout<<MI[i][j];
  107.                         if(MI[i][j] >=10) std::cout<<" ";
  108.                         else std::cout<<"  ";
  109.                 }
  110.                 cout<<endl;
  111.          }
  112.  
  113.  
  114.          //To jest pod skrypt z Pythona z zestawu 1 ktory KAMIL MARKS,
  115.          //KAMIL MARKS mial poprawic zeby ladnie rysowalo
  116.          fstream plik;
  117.          plik.open("dane.txt",ios::out | ios::trunc);
  118.          if(plik.good())
  119.          {
  120.                 plik << "N\r\n";
  121.                 for(int i = 0; i < n; i++)
  122.                 {
  123.                         for(int j = 0; j < n; j++)
  124.                         {
  125.                                 plik << MS[i][j];
  126.                                 if(j < n - 1) plik << " ";
  127.                         }
  128.                         plik<<"\r\n";
  129.                 }
  130.                 plik.close();
  131.          }
  132.  
  133.          cout<<endl<<endl<<endl;
  134.          graf.UstawWszystko(MI,n,l);
  135.          graf.Wypisz();
  136.          int zrodlo;
  137.  
  138.          //Podajemy wierzcholek z ktorego zaczynamy algorytm Dijkstry
  139.          do
  140.          {
  141.                 cout<<"Podaj wierzcholek poczatkowy (zakres 0-"<<n-1<<"): "; cin>>zrodlo;
  142.          }while(zrodlo >=n);
  143.  
  144.          graf.Dijkstra(zrodlo,graf.ZwrocWagi());
  145.          graf.Johnson();
  146.          graf.Kruskal(MI,l);
  147.  
  148.          for(int i = 0; i < n; i++)
  149.          {
  150.                 delete [] MS[i];
  151.                 delete [] MI[i];
  152.          }
  153.          delete [] MS;
  154.          delete [] MI;
  155.  
  156.  
  157.  
  158.         return 0;
  159. }
  160.  
  161.  
  162.  
  163. /////////////////////////////////////////
  164. /////////////////////////////////////////
  165. /////////////////////////////////////////
  166. /////////////////////////////////////////
  167. /////////////////////////////////////////
  168. /////////////////////////////////////////
  169. /////////////////////////////////////////
  170. /////////////////////////////////////////
  171. /////////////////////////////////////////
  172. /////////////////////////////////////////
  173. /////////////////////////////////////////
  174. /////////////////////////////////////////
  175. /////////////////////////////////////////
  176. /////////////////////////////////////////
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184. #pragma once
  185.  
  186. #include "Graf.h"
  187.  
  188. //Algorytmy z zestawu 1
  189.  
  190. int krawedz( int *&rozmiar,  int **&dane,  int &ilosc)
  191. {
  192.     int max_elem = 0;
  193.     for(int i = 0; i < ilosc; i++)
  194.     {
  195.         for(int j = 0; j < rozmiar[i]; j++)
  196.             max_elem++;
  197.     }
  198.     return max_elem;
  199. }
  200.  
  201. void L_to_I(int *rozmiar,  int**dane,  int &ilosc, int **&MI)
  202. {
  203.     const int max = krawedz(rozmiar, dane, ilosc) / 2;
  204.     MI = new int *[ilosc];
  205.     for(int i = 0; i < ilosc; i++)
  206.     {
  207.         MI[i] = new int [max];
  208.         for(int j = 0; j < max; j++)
  209.             MI[i][j] = 0;
  210.     }
  211.     int x = 0;
  212.     int k = 1;
  213.    for(int i = 0; i < ilosc; i++)
  214.     {
  215.         for(int j = 0; j < rozmiar[i]; j++)
  216.         {  
  217.             if(k < dane[i][j])
  218.             {
  219.                 int los = rand()%10 + 1;
  220.                 MI[i][x] = los;
  221.                 MI[dane[i][j] - 1][x] = los;
  222.                 x++;
  223.             }
  224.         }
  225.         k++;
  226.         if(x == max) break;
  227.     }
  228.  
  229.      std::cout<<"MACIERZ INCYDENCJI\n";
  230.    /* for(int i = 0; i < ilosc; i++)
  231.     {
  232.         for(int j = 0; j < max; j++)
  233.             {
  234.                 std::cout<<MI[i][j]<<" ";
  235.             }
  236.             std::cout<<std::endl;
  237.     }
  238.    for(int i = 0; i < ilosc; i++)
  239.     {
  240.         delete [] MI[i];
  241.     }
  242.     delete [] MI;*/
  243. }
  244.  
  245. void S_to_L_to_I(int **&dane, int &rozmiar, int **&MI)
  246. {
  247.     int **L = new int *[rozmiar];
  248.     int *wielkoscL = new int [rozmiar];
  249.     //Ustawianie tablica na wlasniwe rozmiary
  250.     for(int i = 0; i < rozmiar; i++)
  251.     {
  252.         int ilosc_w_wierszu = 0;
  253.         for(int j = 0; j < rozmiar; j++)
  254.         {
  255.             if(dane[i][j]) ilosc_w_wierszu++;
  256.         }
  257.         wielkoscL[i] = ilosc_w_wierszu;
  258.         L[i] = new int [ilosc_w_wierszu];
  259.     }
  260.     //Uzupelnianie listy sasiedztwa
  261.     for(int i = 0; i < rozmiar; i++)
  262.     {
  263.         int k = 0;
  264.         for(int j = 0; j < rozmiar; j++)
  265.         {
  266.             if(dane[i][j])
  267.             {
  268.                 L[i][k++] = j + 1;
  269.             }
  270.             if(k == wielkoscL[i]) break;
  271.         }
  272.     }
  273.     //Wypisywanie listy sasiedztwa
  274.   /*  std::cout<<"LISTA SASIEDZTWA\n";
  275.     for(int i = 0; i < rozmiar; i++)
  276.     {
  277.         std::cout<<i + 1<<": ";
  278.         for(int j = 0;  j< wielkoscL[i]; j++)
  279.         {
  280.             std::cout<<L[i][j]<<" ";
  281.         }
  282.         std::cout<<std::endl;
  283.     }*/
  284.     L_to_I(wielkoscL, L, rozmiar, MI);
  285.  
  286.     //Zwalnianie pamieci
  287.     for(int i = 0; i < rozmiar; i++)
  288.         delete [] L[i];
  289.     delete [] L;
  290.     delete [] wielkoscL;
  291. }  
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298.  
  299.  
  300.  
  301.  
  302.  
  303.  
  304.  
  305.  
  306.  
  307.  
  308.