Guest User

Untitled

a guest
Jun 4th, 2017
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.73 KB | None | 0 0
  1. /*
  2. 9 13
  3. 0 1
  4. 0 4
  5. 1 2
  6. 2 5
  7. 4 1
  8. 4 3
  9. 4 5
  10. 4 6
  11. 4 7
  12. 5 8
  13. 7 6
  14. 8 4
  15. 8 7
  16. */
  17.  
  18. #include <iostream>
  19. #include <fstream>
  20. #include <vector>
  21. #include <stdlib.h>
  22. #include <stack>
  23. using namespace std;
  24.  
  25. struct lista
  26. {
  27.   int wartosc;
  28.   lista *nastepny;
  29. };
  30. int licznikI = 0;
  31.  
  32. void wczytaj_z_pliku();
  33. void zmien_rozmiar(vector <vector<int> > &lista_sasiedztwa, vector <int> wiersz, int ilosc_wierzcholkow);
  34. void dodaj_do_listy(vector <vector<int> > &lista_sasiedztwa, int pierwszy_wierzcholek, int drugi_wierzcholek);
  35. void przeczytaj_sasiadow(vector <vector<int> > lista_sasiedztwa);
  36. void dfs(vector <vector<int> > &lista_sasiedztwa);
  37. void dfs_visit(vector <vector<int> > &lista_sasiedztwa, stack <int> &odwiedzone_wierzcholki,
  38.                 int wierzcholek, vector <int> &tablica_numerow_wierzcholkow, vector <int> &tablica_parametrow, vector <bool> &czy_jest_na_stose, int &cvn, vector <lista*> &lista_spojnych);
  39. void odczytaj_skladowe(vector <lista*> lista_spojnych);
  40. void sprzatnij(vector <lista*> &lista_spojnych);
  41.  
  42. int main()
  43. {
  44.     wczytaj_z_pliku();
  45.  
  46.     return 0;
  47. }
  48.  
  49. void wczytaj_z_pliku()
  50. {
  51.     string linia;
  52.     string bufor;
  53.  
  54.     int ilosc_wierzchlkow;
  55.     int rozmiar_lini;
  56.     int id = 0;
  57.     int ilosc_krawedzi;
  58.     int pierwszy_wierzcholek;
  59.     int drugi_wierzcholek;
  60.  
  61.  
  62.     vector <int> wiersz;
  63.     vector <vector<int> > lista_sasiedztwa(1, wiersz);
  64.  
  65.     fstream plik;
  66.     plik.open("plik.txt",ios::in);
  67.  
  68.     while(!plik.eof())
  69.     {
  70.         getline(plik,linia);
  71.         rozmiar_lini = linia.size()-1;
  72.         switch(id)
  73.         {
  74. // wczytuje liczbe z napisu do spacji i po spacji i odpowiednio rozdzielam wiedzac jakie jest ulozenie liczb w pliku
  75. // np   string = '1245 567'; liczba a = 1245, liczba b = 567
  76.         case 0:
  77.         {
  78.             for(int i=0; i < rozmiar_lini; i++)
  79.             {
  80.                 if(linia[i] == ' ')
  81.                 {
  82.                     bufor.clear();
  83.                     for(int j=0; j < i; j++)
  84.                     {
  85.                         bufor[j] = linia[j];
  86.                     }
  87.  
  88.                     ilosc_wierzchlkow = atoi(bufor.c_str());
  89.                     bufor.clear();
  90.  
  91.                     zmien_rozmiar(lista_sasiedztwa, wiersz, ilosc_wierzchlkow);
  92.  
  93.                     int roboczy = 0;
  94.  
  95.                     for(int j = i+1; j < rozmiar_lini; j++)
  96.                     {
  97.                         bufor[roboczy] = linia[j];
  98.                         roboczy++;
  99.                     }
  100.                     ilosc_krawedzi = atoi(bufor.c_str());
  101.                 }
  102.             }
  103.         }
  104.         break;
  105.  
  106.         default:
  107.         {
  108.             for(int i=0; i < rozmiar_lini; i++)
  109.             {
  110.                 if(linia[i] == ' ')
  111.                 {
  112.                     bufor.clear();
  113.                     for(int j=0; j < i; j++)
  114.                     {
  115.                         bufor[j] = linia[j];
  116.                     }
  117.                     pierwszy_wierzcholek = atoi(bufor.c_str());
  118.  
  119.                     int roboczy = 0;
  120.                     for(int j = i + 1; j <= rozmiar_lini; j++)
  121.                     {
  122.                         bufor[roboczy] = linia[j];
  123.                         roboczy ++;
  124.                     }
  125.                     roboczy = 0;
  126.                     drugi_wierzcholek = atoi(bufor.c_str());
  127.                     bufor.clear();
  128.  
  129.                     dodaj_do_listy(lista_sasiedztwa, pierwszy_wierzcholek, drugi_wierzcholek);
  130.                 }
  131.             }
  132.         }
  133.         break;
  134.         }//koniec switch
  135.         id++;
  136.     } //koniec while
  137. plik.close();
  138. //przeczytaj_sasiadow(lista_sasiedztwa);
  139. dfs(lista_sasiedztwa);
  140. }// koniec funkcji
  141.  
  142. void zmien_rozmiar(vector <vector<int> > &lista_sasiedztwa, vector <int> wiersz, int ilosc_wierzcholkow)
  143. {
  144.     lista_sasiedztwa.resize(ilosc_wierzcholkow, wiersz);
  145. }
  146. void dodaj_do_listy(vector <vector<int> > &lista_sasiedztwa,int pierwszy_wierzcholek, int drugi_wierzcholek)
  147. {
  148.     lista_sasiedztwa[pierwszy_wierzcholek].push_back(drugi_wierzcholek);
  149. }
  150. void przeczytaj_sasiadow(vector <vector<int> > lista_sasiedztwa)
  151. {
  152.  
  153.     for(int i = 0; i < lista_sasiedztwa.size(); i++)
  154.     {
  155.         for(int j = 0; j < lista_sasiedztwa[i].size(); j++)
  156.         {
  157.             cout<<lista_sasiedztwa[i][j]<<endl;
  158.         }
  159.         cout<<endl;
  160.     }
  161. }
  162. void dfs(vector <vector<int> > &lista_sasiedztwa)
  163. {
  164.     vector <int> tablica_numerow_wierzcholkow(lista_sasiedztwa.size(), 0); // VN
  165.     vector <int> tablica_parametrow(lista_sasiedztwa.size(), 0); //VLow
  166.     vector <bool> czy_jest_na_stose(lista_sasiedztwa.size(), false);
  167.     stack <int> odwiedzone_wierzcholki;
  168.     vector <lista*> lista_spojnych(lista_sasiedztwa.size(), NULL);
  169.  
  170.  
  171.     int cvn = 0;
  172.  
  173.        for(int i = 0; i < lista_sasiedztwa.size(); i++)
  174.        {
  175.            if(!tablica_numerow_wierzcholkow[i])
  176.            {
  177.               dfs_visit(lista_sasiedztwa, odwiedzone_wierzcholki, i, tablica_numerow_wierzcholkow, tablica_parametrow, czy_jest_na_stose, cvn, lista_spojnych);
  178.            }
  179.        }
  180.  
  181.        odczytaj_skladowe(lista_spojnych);
  182.        //sprzatnij(lista_spojnych);
  183. }
  184. void dfs_visit(vector <vector<int> > &lista_sasiedztwa, stack <int> &odwiedzone_wierzcholki,
  185.                 int wierzcholek, vector <int> &tablica_numerow_wierzcholkow, vector <int> &tablica_parametrow, vector <bool> &czy_jest_na_stose, int &cvn, vector <lista*> &lista_spojnych)
  186. {
  187.  
  188.     tablica_numerow_wierzcholkow[wierzcholek] = tablica_parametrow[wierzcholek] = cvn;
  189.     cvn++;
  190.     odwiedzone_wierzcholki.push(wierzcholek);
  191.     czy_jest_na_stose[wierzcholek] = true;
  192.  
  193.     for(int i = 0; i < lista_sasiedztwa[wierzcholek].size(); i++)
  194.     {
  195.             if(!tablica_numerow_wierzcholkow[lista_sasiedztwa[wierzcholek][i]])
  196.             {
  197.                 dfs_visit(lista_sasiedztwa, odwiedzone_wierzcholki, lista_sasiedztwa[wierzcholek][i], tablica_numerow_wierzcholkow, tablica_parametrow,
  198.                        czy_jest_na_stose, cvn, lista_spojnych);
  199.  
  200.                 tablica_parametrow[wierzcholek] = min(tablica_parametrow[wierzcholek], tablica_parametrow[lista_sasiedztwa[wierzcholek][i]]);
  201.             }
  202.  
  203.             else if(czy_jest_na_stose[lista_sasiedztwa[wierzcholek][i]])
  204.             {
  205.                 tablica_parametrow[wierzcholek] =
  206.                 min(tablica_parametrow[wierzcholek], tablica_numerow_wierzcholkow[lista_sasiedztwa[wierzcholek][i]]);
  207.  
  208.             }
  209.     }
  210.  
  211.     if(tablica_parametrow[wierzcholek] == tablica_numerow_wierzcholkow[wierzcholek])
  212.     {
  213.         lista *roboczy;
  214.         lista *start = NULL;
  215.         int u;
  216.         do
  217.         {
  218.             u = odwiedzone_wierzcholki.top();
  219.             odwiedzone_wierzcholki.pop();
  220.             czy_jest_na_stose[u] = false;
  221.  
  222.             roboczy = new lista;
  223.  
  224.             roboczy->wartosc = u;
  225.             roboczy->nastepny = start;
  226.             start = roboczy;
  227.  
  228.         }while(u != wierzcholek);
  229.         lista_spojnych[licznikI] = start;
  230.         licznikI++;
  231.         delete roboczy;
  232.         delete start;
  233.     }
  234. }
  235. void odczytaj_skladowe(vector <lista*> lista_spojnych)
  236. {
  237.     for(int i = 0; i < lista_spojnych.size(); i++)
  238.     {
  239.         cout<<"SSS numer: "<<i<<endl;
  240.         while(lista_spojnych[i] != NULL)
  241.         {
  242.             cout<<lista_spojnych[i]->wartosc<<"\t";
  243.             lista_spojnych[i] = lista_spojnych[i]->nastepny;
  244.         }
  245.         cout<<endl;
  246.     }
  247. }
  248. void sprzatnij(vector <lista*> &lista_spojnych)
  249. {
  250.     for(int i = 0; i < lista_spojnych.size(); i++)
  251.     {
  252.         lista_spojnych[i] = lista_spojnych[i]->nastepny;
  253.         while(lista_spojnych[i] != NULL)
  254.         {
  255.             lista *roboczy;
  256.             roboczy = lista_spojnych[i];
  257.             lista_spojnych[i] = roboczy->nastepny;
  258.             delete roboczy;
  259.         }
  260.     }
  261. }
  262. /*
  263. Skladowe:
  264.  
  265.  
  266. */
Advertisement
Add Comment
Please, Sign In to add comment