Advertisement
Guest User

Untitled

a guest
Sep 21st, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.46 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6.  
  7.  
  8. struct pionki
  9. {
  10.     int pionek;
  11.     pionki * next;
  12.     pionki()
  13.     {
  14.         next = 0;
  15.     }
  16. };
  17.  
  18. struct kolejka
  19. {
  20.     pionki * pierwszy;
  21.     pionki* ostatni;
  22.     //int f = 1;
  23.     kolejka()
  24.     {
  25.         pierwszy = 0;
  26.     }
  27.  
  28.     void dodaj(int pionek)
  29.     {
  30.         if(pierwszy == 0){
  31.             ostatni = new pionki;
  32.             ostatni->pionek = pionek;
  33.             pierwszy = new pionki;
  34.             pierwszy->pionek = pionek;
  35.             pierwszy->next = ostatni;
  36.         }
  37.         else{
  38.             pionki * nowy = new pionki;
  39.             nowy->pionek = pionek;
  40.             ostatni->next = nowy;
  41.             ostatni = nowy;
  42.         }
  43.  
  44.     }
  45.  
  46.     int * zdejmij(int n)
  47.     { int *tab = new int[n];
  48.         pionki * pom = pierwszy;
  49.         pom = pom->next;
  50.         for(int i = 0; i<n;i++){
  51.             tab[i] = pom->pionek;
  52.             pom = pom->next;
  53.         }
  54.         return tab;
  55.     }
  56.  
  57.     void show()
  58.     {
  59.         if(pierwszy != 0){
  60.         pionki * pom = pierwszy;
  61.         pom = pom->next;
  62.         while(pom){
  63.             cout<<pom->pionek<<" ";
  64.             pom = pom->next;
  65.         }
  66.         }
  67.     }
  68.  
  69.  
  70.  
  71.     bool exist(int w)
  72.     {
  73.         pionki * pom = pierwszy;
  74.         pom = pom->next;
  75.         while(pom){
  76.             //cout<<pom->pionek<<" ";
  77.             if(w == pom->pionek)
  78.                 return true;
  79.             pom = pom->next;
  80.  
  81.         }
  82.         return false;
  83.     }
  84.     short last()
  85.     {
  86.         pionki * pom = pierwszy;
  87.         if(pom){
  88.             if(pom->next){
  89.                 while(pom->next->next){
  90.                     pom = pom->next;
  91.                 }
  92.                 return pom->pionek;
  93.             }
  94.         }
  95.     }
  96.     int ost()
  97.     {
  98.         return ostatni->pionek;
  99.     }
  100. };
  101.  
  102.  
  103.  
  104.  
  105.  
  106. struct Wierzcholek;
  107.  
  108. struct Krawedz
  109. {
  110.     Wierzcholek* koniec;
  111.     int waga;
  112.  
  113.     Krawedz(int waga, Wierzcholek *start)
  114.     {
  115.         this->waga=waga;
  116.         koniec=start;
  117.     }
  118. };
  119.  
  120. struct Wierzcholek
  121. {
  122.     int klucz;
  123.     Wierzcholek *poprzednik;
  124.     int odleglosc;
  125.     vector<Krawedz*> sasiedzi;
  126.  
  127.     Wierzcholek(int klucz)
  128.     {
  129.         this->klucz=klucz;
  130.     }
  131.  
  132.     Wierzcholek();
  133. };
  134.  
  135. class Graf
  136. {
  137. public:
  138.     vector<Wierzcholek*> wierzcholki;
  139.  
  140.     void dodajWierzcholek(int a)
  141.     {
  142.         Wierzcholek *w = new Wierzcholek(a);
  143.         wierzcholki.push_back(w);
  144.     }
  145.  
  146.     void dodajKrawedz(int a, int b, int waga)
  147.     {
  148.         if(a != b){
  149.             int dl=wierzcholki.size();
  150.             Wierzcholek *w1;
  151.             Wierzcholek *w2;
  152.             for(int i=0; i<dl; i++)
  153.             {
  154.                 if(wierzcholki[i]->klucz == a)
  155.                     w1 = wierzcholki[i];
  156.                 else if(wierzcholki[i]->klucz == b)
  157.                     w2 = wierzcholki[i];
  158.             }
  159.             Krawedz *krawedz = new Krawedz(waga,w2);
  160.             w1->sasiedzi.push_back(krawedz);
  161.             Krawedz *k2 = new Krawedz(waga,w1);
  162.             //krawedz = new Krawedz(waga,w1);
  163.             w2->sasiedzi.push_back(k2);
  164.         }
  165.     }
  166.  
  167.     Wierzcholek * findPoKluczu(int a)
  168.     {
  169.         for(int i = 0; i< wierzcholki.size();i++){
  170.             if(wierzcholki[i]->klucz == a){
  171.                 return wierzcholki[i];
  172.             }
  173.         }
  174.         Wierzcholek * w = new Wierzcholek(2147483645);
  175.         return w;
  176.     }
  177.  
  178.  
  179.  
  180. // s - wierzcholek startowy, wyznaczenie najkrótszej drogi do ka¿dego z pozosta³ych wierzcho³ków
  181.     void algorytmDijkstry(Wierzcholek *s)
  182.     {
  183.         inicjalizuj(s);
  184.         vector<Wierzcholek*> Q = this->wierzcholki;
  185.         int dl=Q.size();
  186.         Wierzcholek *u;
  187.         int j;
  188.         while(!Q.empty())
  189.         {
  190.             u=Q[0];
  191.             j=0;
  192.             dl=Q.size();
  193.             for(int i=1; i<dl; i++)
  194.             {
  195.                 if(Q[i]->odleglosc < u->odleglosc)
  196.                 {
  197.                     u=Q[i];
  198.                     j=i;
  199.                 }
  200.             }
  201.             Q.erase(Q.begin()+j);
  202.  
  203.             for(int i=0; i<u->sasiedzi.size(); i++)
  204.             {
  205.                 if(u->sasiedzi[i]->koniec->odleglosc > (u->odleglosc + u->sasiedzi[i]->waga))
  206.                 {
  207.                     u->sasiedzi[i]->koniec->poprzednik=u;
  208.                     u->sasiedzi[i]->koniec->odleglosc=u->odleglosc + u->sasiedzi[i]->waga;
  209.                 }
  210.             }
  211.         }
  212.     }
  213.  
  214.     void inicjalizuj(Wierzcholek* s)
  215.     {
  216.         for(int i=0; i<this->wierzcholki.size(); i++)
  217.         {
  218.             this->wierzcholki[i]->odleglosc=2147483645;
  219.         }
  220.         s->odleglosc=0;
  221.     }
  222.  
  223.     void drukuj()
  224.     {
  225.         for(int i=0; i<wierzcholki.size(); i++){
  226.         cout<<"Sasiedzi wierzcholka "<<wierzcholki[i]->klucz<<": ";
  227.         for(int j = 0; j<wierzcholki[i]->sasiedzi.size();j++)
  228.             cout<<wierzcholki[i]->sasiedzi[j]->koniec->klucz<<" ";
  229.         cout<<endl;
  230.     }
  231.     }
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238. };
  239.  
  240. bool exist(vector <int> w,int pom)
  241. { int i = 0,n;
  242.     cout<<"Elementy wektora: ";
  243.     while(!w.empty()){
  244.         cout<<w[i];
  245.         if(w[i] == pom)
  246.             return true;
  247.         i++;
  248.     }
  249.     return false;
  250. }
  251.  
  252. int main()
  253. {
  254.     int wierzcholki,krawedzie, pom1, pom2,p,o;
  255.     bool ruch_p1 = false, ruch_p2 = false, byl_ruch = false;
  256.     Graf *graf = new Graf();
  257.     Wierzcholek * cel;
  258.  
  259.     kolejka wystapienia;
  260.     kolejka odwiedz;
  261.  
  262.     cin>>wierzcholki;
  263.     cin>>krawedzie;
  264.  
  265.     cin>>pom1;
  266.     wystapienia.dodaj(pom1);
  267.     cin>>pom2;
  268.     wystapienia.dodaj(pom2);
  269.     graf->dodajWierzcholek(pom1);
  270.     graf->dodajWierzcholek(pom2);
  271.     graf->dodajKrawedz(pom1,pom2,1);
  272.     //cout<<"przeszlo"<<endl;
  273.     for(int i = 1; i < krawedzie;i++){
  274.         cin>>pom1;
  275.         //cout<<"pobrano pierwszy"<<endl;
  276.         if(wystapienia.exist(pom1) == false){
  277.             wystapienia.dodaj(pom1);
  278.             graf->dodajWierzcholek(pom1);
  279.            // cout<<"Dodano w " <<i<<" obrocie pierwszy wierzcholek"<<endl;
  280.         }
  281.         cin>>pom2;
  282.         //cout<<":))"<<endl;
  283.         if(wystapienia.exist(pom2) == false){
  284.             wystapienia.dodaj(pom2);
  285.             graf->dodajWierzcholek(pom2);
  286.             //cout<<"Dodano w " <<i<<" obrocie drugi wierzcholek"<<endl;
  287.         }
  288.         graf->dodajKrawedz(pom1,pom2,1);
  289.     /*
  290.         graf->dodajWierzcholek(pom1);
  291.         graf->dodajWierzcholek(pom2);
  292.         graf->dodajKrawedz(pom1,pom2,1);  */
  293.     }
  294.     cin>>p;
  295.     Wierzcholek * p1 = new Wierzcholek(p);
  296.     cin>>p;
  297.     Wierzcholek * p2 = new Wierzcholek(p);
  298.     Wierzcholek * temp1;
  299.     Wierzcholek * temp2;
  300.     cin>>o;
  301.     for(int i = 0; i<o;i++){
  302.         cin>>pom1;
  303.         odwiedz.dodaj(pom1);
  304.     }
  305.     //cout<<"ODWIEDZINY: ";
  306.     //odwiedz.show();
  307.     //cout<<endl;
  308.  
  309.  
  310.     //graf->drukuj();
  311.     //cout<<endl;
  312.     //cout<<"Elementy do odwiedzenia: "<<endl;
  313.     //odwiedz.show();
  314.  
  315. //    int check = odwiedz.zdejmij();
  316.     //cout<<"CHECK: "<<check<<endl;
  317.   //  check = odwiedz.zdejmij();
  318.     //cout<<"CHECK: "<<check<<endl;
  319.  
  320.  
  321.     int * tab = odwiedz.zdejmij(o);
  322.     kolejka wyjscie;
  323.     //wyjscie.show();
  324.  
  325.  
  326.  
  327.     //cout<<"Wynik:)) : ";
  328.  
  329.     for(int i = 0; i<o;i++){
  330.         //cout<<"tab[i]: "<<tab[i]<<endl;
  331.  
  332.  
  333.         cel = graf->findPoKluczu(tab[i]);
  334.         if(cel->klucz == 2147483645){
  335.             cout<<"Brak połączenia z wierzchołkiem "<<tab[i]<<endl;
  336.             return 0;
  337.         }
  338.         //cout<<"Zadany wierzcholek: "<<cel->klucz<<endl;
  339.         graf->algorytmDijkstry(cel);
  340.         p1 = graf->findPoKluczu(p1->klucz);
  341.         p2 = graf->findPoKluczu(p2->klucz);
  342.  
  343.         if(graf->findPoKluczu(p1->klucz)->odleglosc == 2147483645 && graf->findPoKluczu(p2->klucz)->odleglosc == 2147483645){
  344.             cout<<"Brak połączenia z wierzchołkiem "<<tab[i]<<endl;
  345.             return 0;
  346.         }
  347.  
  348.  
  349.         if(p1->odleglosc < p2->odleglosc){
  350.             wyjscie.dodaj(1);
  351.             ruch_p1 = true;
  352.             ruch_p2 = false;
  353.             byl_ruch = true;
  354.             p1 = cel;
  355.         }
  356.         if(p1->odleglosc > p2->odleglosc){
  357.             wyjscie.dodaj(2);
  358.             ruch_p2 = true;
  359.             ruch_p1 = false;
  360.             byl_ruch = true;
  361.             p2 = cel;
  362.         }
  363.         if(p1->odleglosc == p2->odleglosc){
  364.             if(byl_ruch == false){
  365.                 wyjscie.dodaj(1);
  366.                 ruch_p1 = true;
  367.                 ruch_p2 = false;
  368.                 byl_ruch = true;
  369.                 p1 = cel;
  370.             }
  371.             else{
  372.                 if(ruch_p2 == true){
  373.                     wyjscie.dodaj(1);
  374.                     ruch_p1 = true;
  375.                     ruch_p2 = false;
  376.                     byl_ruch = true;
  377.                     p1 = cel;
  378.                 }
  379.                 else{
  380.                     wyjscie.dodaj(2);
  381.                     ruch_p2 = true;
  382.                     ruch_p1 = false;
  383.                     byl_ruch = true;
  384.                     p2 = cel;
  385.                 }
  386.             }
  387.         }
  388.  
  389.     }
  390.     wyjscie.show();
  391.  
  392.     /*
  393.     cout<<"Zadany wierzcholek: "<<graf->wierzcholki[4]->klucz<<endl;
  394.     for(int i=0; i<graf->wierzcholki.size(); i++)
  395.     {
  396.         cout << "Klucz: " <<graf->wierzcholki[i]->klucz <<endl<< "Odleglosc od wierzcholka startowego: "<< graf->wierzcholki[i]->odleglosc << endl<<"Klucz poprzednika: " << graf->wierzcholki[i]->poprzednik->klucz << endl;
  397.         cout<<"######################################"<<endl;
  398.     }
  399.     cout<<endl<<"Graf po algorytmie: "<<endl;
  400.     graf->drukuj();
  401.     */
  402.  
  403.     return 0;
  404. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement