Advertisement
adwas33

Kolowium grafy (90% + po tym dostałem 5.0 na koniec )

May 7th, 2022
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.05 KB | None | 0 0
  1. #include<iostream>
  2. #include<fstream>
  3.  
  4.  
  5. using namespace std;
  6.  
  7. ///@attention Kolokwium znajduje się na dole pracy
  8.  
  9. struct Graf_MacierzSasiedztwa // macierz sąsiedztwa
  10. {
  11. double** matrix; //macierz
  12. int size; // rozmiar
  13. };
  14.  
  15. struct Node
  16. {
  17. Node* next;
  18. int from;
  19. int to;
  20. double val;
  21. };
  22.  
  23. void show_list_rek(Node * H) {
  24. if (H != nullptr) {
  25. cout << "Wartosc "<< H -> val << " ->";
  26. if (H -> next != nullptr)
  27. show_list_rek(H -> next);
  28. else cout << "nullptr";
  29. }
  30. }
  31. void add(Node * & H,int to, double value) {
  32. Node * p = new Node;
  33. p -> val = value;
  34. p->to=to;
  35. p -> next = H;
  36. H = p;
  37.  
  38. }
  39.  
  40. void add(Node * & H,int to ,int from, double value) {
  41. Node * p = new Node;
  42. p -> val = value;
  43. p->to=to;
  44. p -> next = H;
  45. p->from=from;
  46. H = p;
  47.  
  48. }
  49.  
  50. void add(Node * & H,Node* p) {
  51. Node *k= new Node(*p);
  52.  
  53. k -> next = H;
  54.  
  55. H = k;
  56.  
  57. }
  58. void swapValue( Node *a, Node *b)
  59. {
  60. int temp = a->val;
  61. a->val = b->val;
  62. b->val = temp;
  63. }
  64.  
  65.  
  66. void bubbleSort(Node *&head)
  67. {
  68. int i;
  69. bool isSwapNessesary;
  70. struct Node *p;
  71. struct Node *lastStand = nullptr;
  72. if (head == nullptr)
  73. return;
  74. do
  75. {
  76. isSwapNessesary = false;
  77. p = head;
  78.  
  79. while (p->next != lastStand)
  80. {
  81. if (p->val > p->next->val)
  82. {
  83. swapValue(p, p->next);
  84. isSwapNessesary = true;
  85. }
  86. p = p->next;
  87. }
  88. lastStand = p;
  89. }
  90. while (isSwapNessesary);
  91. }
  92.  
  93. int calculateNumberOfElementsInLinkedList(Node *&head) {
  94. int licznik = 0;
  95. Node * p = head;
  96. while (p) // liczę ilość elementów w tablicy
  97. {
  98. licznik++;
  99. p = p -> next;
  100.  
  101. }
  102. return licznik;
  103. }
  104.  
  105. Node *jumpOverGapRange(int gap, int iterator, Node *tmpHead, Node *endingElement) {
  106. endingElement = tmpHead;
  107. iterator = 1;
  108. while (endingElement->next && iterator < gap) {
  109. endingElement = endingElement->next;
  110. iterator++;
  111. }
  112. return endingElement;
  113. }
  114. void sortowanieGrzebieniowe(Node*& head) {
  115.  
  116. if (head) {
  117. if (head -> next == nullptr) ///jednoelementowa tablica
  118. {
  119. return;
  120. }
  121. else
  122. {
  123. int gap = calculateNumberOfElementsInLinkedList(head);
  124. int iterator = 0;
  125. bool replace = true;
  126. Node* before = nullptr;
  127. Node* tmp = nullptr;
  128. Node* tmpHead;
  129. Node* endingElement;
  130. Node* afterEndingElement = nullptr;
  131.  
  132. while (gap > 1 || replace)
  133. {
  134. gap = gap * 10 / 13;
  135. if(gap==0)
  136. {
  137. gap=1;
  138. }
  139. endingElement =head;
  140. tmpHead = head;
  141. replace = false;
  142. if (gap == 1) {
  143. bubbleSort(head);
  144. continue;
  145. }
  146. while (tmpHead && endingElement->next->next) {
  147.  
  148. endingElement = jumpOverGapRange(gap, iterator, tmpHead, endingElement);
  149.  
  150. if (tmpHead->val > endingElement->next->val) {
  151. if (before == nullptr)
  152. {
  153. tmp = endingElement->next;
  154. afterEndingElement = tmp->next;
  155. tmp->next = tmpHead->next;
  156. endingElement->next = tmpHead;
  157. tmpHead->next = afterEndingElement;
  158.  
  159. tmpHead = tmp;
  160. head = tmp;
  161. }
  162. else
  163. {
  164. tmp = endingElement->next;
  165. afterEndingElement = tmp->next;
  166. tmp->next = tmpHead->next;
  167. endingElement->next = tmpHead;
  168. before->next = tmp;
  169. tmpHead->next = afterEndingElement;
  170.  
  171. tmpHead = tmp;
  172. }
  173. }
  174. before = tmpHead;
  175. tmpHead = tmpHead->next;
  176. }
  177. }
  178. }}}
  179.  
  180. Node* sortedMerge(Node* a, Node* b)
  181. {
  182. Node* result = nullptr;
  183.  
  184.  
  185. if (a == nullptr)
  186. return(b);
  187. else if (b == nullptr)
  188. return(a);
  189.  
  190. if (a->val <= b->val)
  191. {
  192. result = a;
  193. result->next = sortedMerge(a->next, b);
  194. }
  195. else
  196. {
  197. result = b;
  198. result->next = sortedMerge(a, b->next);
  199. }
  200. return(result);
  201. }
  202.  
  203. Node* sortedMerge(Node* a, Node* b,int from)
  204. {
  205. Node* result = nullptr;
  206.  
  207.  
  208. if (a == nullptr)
  209. return(b);
  210. else if (b == nullptr)
  211. return(a);
  212.  
  213. if (a->val <= b->val)
  214. {
  215. result = a;
  216. result->from=from;
  217. result->next = sortedMerge(a->next, b,from);
  218. }
  219. else
  220. {
  221. result = b;
  222. result->from=from;
  223. result->next = sortedMerge(a, b->next,from);
  224. }
  225. return(result);
  226. }
  227. void przepnijWskaznikHeda(Node *&scalona,Node *&wynikowa)
  228. {
  229. Node * pom=scalona;
  230. scalona=scalona->next;
  231. pom->next=wynikowa;
  232. wynikowa=pom;
  233. }
  234. ///
  235. /// \param scalona
  236. /// \param wynikowa
  237. void przepnijWskaznikNastepnika(Node *&scalona,Node *&wynikowa)
  238. {
  239. Node * pom=scalona;
  240. scalona=scalona->next;
  241. pom->next=wynikowa->next;
  242. wynikowa->next=pom;
  243. }
  244. /// @warning NIE DZIALA POPRAWNIE DLA SCIEZEK WZGLEDNYCH
  245. /// \param FileName jako parametr podac sciezke bezwzgledna
  246. /// \return zwraca macierz sasiedzctwa
  247.  
  248. Graf_MacierzSasiedztwa* CzytajGraf(string FileName)
  249. {
  250. Graf_MacierzSasiedztwa* gr = new Graf_MacierzSasiedztwa;
  251. fstream czytaj ;
  252. int value = 0;
  253. czytaj.open(FileName);
  254. czytaj >> gr->size;
  255. gr->matrix = new double* [gr->size];
  256. for (int i = 0; i < gr->size; i++)
  257. {
  258. gr->matrix[i] = new double[gr->size];
  259. }
  260. for (int i = 0; i < gr->size; i++)
  261. {
  262. for (int j = 0; j < gr->size; j++)
  263. {
  264. gr->matrix[i][j] = 0;
  265. }
  266. }
  267.  
  268. for (int i = 0; i < gr->size; i++)
  269. {
  270. for (int j = 0; j < gr->size; j++)
  271. {
  272. czytaj >> gr->matrix[i][j];
  273. }
  274. }
  275. czytaj.close();
  276. return gr;
  277. }
  278.  
  279. ///@attention Wypisywanie grafu na bazie macierzy sasiedzctwa
  280. /// \param gr
  281. void WypiszGraf(Graf_MacierzSasiedztwa* gr)
  282. {
  283. for (int i = 0; i < gr->size; i++)
  284. {
  285. for (int j = 0; j < gr->size; j++)
  286. {
  287. cout << gr->matrix[i][j] << " ";
  288. }
  289. cout << endl;
  290. }
  291. cout << endl << endl;
  292. }
  293.  
  294. ///@attention Lista sasiedzctwa nie pamieta skad dane byly brane wiec warto zapamietac te dane przeksztalcajac liste sasiedzctwa lub wyciagajac dane
  295. /// \param matrix
  296. /// \param size
  297. /// \return listę sąsiedzctwa
  298.  
  299. Node **listaSasiedztwa(double **matrix,int size)
  300. {
  301. Node** LN = new Node* [size];
  302. for (int i = 0; i < size ; i++)
  303. LN[i] = nullptr;
  304. for (int i = 0; i < size; i++)
  305. for (int j = 0; j < size; j++)
  306. if(matrix[i][j]!=0)
  307. add(LN[i], j, matrix[i][j]);
  308.  
  309. return LN;
  310.  
  311. }
  312.  
  313. void deleteFirst(Node * & H) {
  314. if (H != nullptr) {
  315. Node * p = H;
  316. H = H -> next;
  317. delete p;
  318. }
  319. }
  320.  
  321.  
  322. void wypiszLas(int size, const int *tablicaLasow) {
  323. for (int i = 0; i < size; i++)
  324. {
  325. cout << tablicaLasow[i];
  326. }
  327. cout<<endl;
  328. }
  329. ///@warning KRUSKAL moze być Zaimplementowany NIEPOPRAWNIE ze względu na złe dane wejściowe !
  330. ///@DEPRECATED Nie warto uzywac
  331. ///@param listaSasiedzctwa
  332. ///NIEPOPRAWNA IMPLEMENTACJA ALGORYTMU KRUSKALA ZE WZGLĘDU NA DANE Z LISTY SĄSIEDZCTWA
  333. ///@param size
  334. ///rozmiar tablicy
  335. Node * algorytm_Kruskala(Node ** listaSasiedzctwa, int size)
  336. {
  337. int * tablicaKolorow= new int [size];
  338. int * tablicaLasow=new int [size];
  339.  
  340. Node *wynikowa= nullptr;
  341.  
  342.  
  343. add(wynikowa,0,0);
  344. Node *scalona= nullptr;
  345. for(int i=0;i<size;i++)
  346. {
  347. bubbleSort(listaSasiedzctwa[i]);
  348. scalona= sortedMerge(scalona,listaSasiedzctwa[i],i);
  349. tablicaLasow[i]=0;
  350. tablicaKolorow[i]=0;
  351. }
  352. int licznikLasow=1;
  353. while(scalona!= nullptr)
  354. {
  355. if((tablicaKolorow[scalona->from]==0)&&tablicaKolorow[scalona->to]==0)
  356. {
  357. tablicaKolorow[scalona->from]=1;
  358. tablicaKolorow[scalona->to]=1;
  359. tablicaLasow[scalona->to]=licznikLasow;
  360. tablicaLasow[scalona->from]=licznikLasow;
  361. licznikLasow++;
  362. przepnijWskaznikHeda(scalona,wynikowa);
  363. wypiszLas(size, tablicaLasow);
  364. // add(wynikowa,scalona);
  365. // deleteFirst(scalona);
  366.  
  367. }
  368. else if(tablicaKolorow[scalona->from]==0 || tablicaKolorow[scalona->to]==0)
  369. {
  370. if(tablicaKolorow[scalona->from]!=0)
  371. {
  372. tablicaKolorow[scalona->to]=1;
  373. tablicaLasow[scalona->to]= tablicaLasow[scalona->from];
  374.  
  375. przepnijWskaznikHeda(scalona,wynikowa);
  376. wypiszLas(size, tablicaLasow);
  377. } else
  378. {
  379. tablicaKolorow[scalona->from]=1;
  380. tablicaLasow[scalona->from]=tablicaLasow[scalona->to];
  381.  
  382.  
  383. przepnijWskaznikHeda(scalona,wynikowa);
  384. wypiszLas(size, tablicaLasow);
  385. }
  386. } else if((tablicaKolorow[scalona->from]!=0 && tablicaKolorow[scalona->to]!=0)&& tablicaLasow[scalona->from]!= tablicaLasow[scalona->to])
  387. {
  388. int lasAktualnyDo=tablicaLasow[scalona->to];
  389. int lasAktualnyOd=tablicaLasow[scalona->from];
  390.  
  391. for(int i=0;i<size;i++)
  392. {
  393. if(tablicaLasow[i]==lasAktualnyOd||tablicaLasow[i]==lasAktualnyDo)
  394. {
  395. tablicaLasow[i]=licznikLasow;
  396. }
  397. wypiszLas(size, tablicaLasow);
  398. }
  399. licznikLasow++;
  400. przepnijWskaznikHeda(scalona,wynikowa);
  401.  
  402. } else if((tablicaKolorow[scalona->from]!=0&& tablicaKolorow[scalona->to]!=0)&&(tablicaLasow[scalona->to]==tablicaLasow[scalona->from]))
  403. {
  404. cout<<"Usuwam krawedz : "<<scalona->from<<" -> "<<scalona->to<<" o wartosci "<<scalona->val<<endl;
  405. deleteFirst(scalona);
  406. }
  407. }
  408. deleteFirst(wynikowa);
  409. return wynikowa;
  410. }
  411. ///@waring Może działać źle
  412. /// \param scalona
  413. /// Jest to lista krawedzi scalona
  414. /// \param size
  415. /// jest to rozmiar tablicy
  416. /// \return
  417. /// zwraca najkrótszą trase która wystarczy do przejscia grafu
  418. Node * algorytm_Kruskala(Node * &scalona, int size)
  419. {
  420. bubbleSort(scalona);
  421. int * tablicaKolorow= new int [size];
  422. int * tablicaLasow=new int [size];
  423.  
  424. Node *wynikowa= nullptr;
  425.  
  426. cout<<" KRUSKAL DEBUG ZACZYNA OD LISTY"<<endl;
  427. show_list_rek(scalona);
  428. add(wynikowa,0,0);
  429.  
  430. bubbleSort(scalona);
  431. for(int i=0;i<size;i++)
  432. {
  433. tablicaLasow[i]=0;
  434. tablicaKolorow[i]=0;
  435. }
  436. int licznikLasow=1;
  437. while(scalona!= nullptr)
  438. {
  439. if((tablicaKolorow[scalona->from]==0)&&tablicaKolorow[scalona->to]==0)
  440. {
  441. tablicaKolorow[scalona->from]=1;
  442. tablicaKolorow[scalona->to]=1;
  443. tablicaLasow[scalona->to]=licznikLasow;
  444. tablicaLasow[scalona->from]=licznikLasow;
  445. licznikLasow++;
  446. przepnijWskaznikHeda(scalona,wynikowa);
  447. wypiszLas(size, tablicaLasow);
  448. // add(wynikowa,scalona);
  449. // deleteFirst(scalona);
  450.  
  451. }
  452. else if(tablicaKolorow[scalona->from]==0 || tablicaKolorow[scalona->to]==0)
  453. {
  454. if(tablicaKolorow[scalona->from]!=0)
  455. {
  456. tablicaKolorow[scalona->to]=1;
  457. tablicaLasow[scalona->to]= tablicaLasow[scalona->from];
  458.  
  459. przepnijWskaznikHeda(scalona,wynikowa);
  460. wypiszLas(size, tablicaLasow);
  461. } else
  462. {
  463. tablicaKolorow[scalona->from]=1;
  464. tablicaLasow[scalona->from]=tablicaLasow[scalona->to];
  465.  
  466.  
  467. przepnijWskaznikHeda(scalona,wynikowa);
  468. wypiszLas(size, tablicaLasow);
  469. }
  470. } else if((tablicaKolorow[scalona->from]!=0 && tablicaKolorow[scalona->to]!=0)&& tablicaLasow[scalona->from]!= tablicaLasow[scalona->to])
  471. {
  472. int lasAktualnyDo=tablicaLasow[scalona->to];
  473. int lasAktualnyOd=tablicaLasow[scalona->from];
  474.  
  475. for(int i=0;i<size;i++)
  476. {
  477. if((tablicaLasow[i]==lasAktualnyOd)||(tablicaLasow[i]==lasAktualnyDo))
  478. {
  479. tablicaLasow[i]=licznikLasow;
  480. }
  481. wypiszLas(size, tablicaLasow);
  482. }
  483. licznikLasow++;
  484. przepnijWskaznikHeda(scalona,wynikowa);
  485.  
  486. } else if((tablicaKolorow[scalona->from]!=0&& tablicaKolorow[scalona->to]!=0)&&(tablicaLasow[scalona->to]==tablicaLasow[scalona->from]))
  487. {
  488. cout<<"Usuwam krawedz : "<<scalona->from<<" -> "<<scalona->to<<" o wartosci "<<scalona->val<<endl;
  489. deleteFirst(scalona);
  490. }
  491. }
  492. cout<<"Kończy na Liscie "<<endl;
  493. show_list_rek(wynikowa);
  494. deleteFirst(wynikowa);
  495. return wynikowa;
  496. }
  497. ///
  498. /// \param macierzSasiedztwa
  499. /// \return
  500. Node * listaKrawedzi(Graf_MacierzSasiedztwa * macierzSasiedztwa)
  501. {
  502. Node * h= nullptr;
  503. for (int i = 0; i < macierzSasiedztwa->size; i++)
  504. for (int j = 0; j < macierzSasiedztwa->size; j++)
  505. if(macierzSasiedztwa->matrix[i][j]!=0)
  506. add(h, j,i, macierzSasiedztwa->matrix[i][j]);
  507.  
  508. return h;
  509. }
  510. ///@attention działa w numerowaniu od Zera
  511. /// \param listaKrawedzi
  512. /// \param size
  513. /// \return liste sasiedzctwa
  514. Node ** listaSasiedzctwaNaBazieListyKrawedzi(Node *listaKrawedzi,int size) // działa w numerowaniu od Zera
  515. {
  516. Node** LN = new Node* [size];
  517. for (int i = 0; i < size ; i++)
  518. LN[i] = nullptr;
  519. while(listaKrawedzi!= nullptr)
  520. {
  521. add(LN[listaKrawedzi->from],listaKrawedzi);
  522. deleteFirst(listaKrawedzi);
  523.  
  524. }
  525.  
  526.  
  527. return LN;
  528. }
  529. ///
  530. /// \param kolory Tablica kolorow
  531. /// \param size rozmiar tablicy
  532. /// \return zwraca prawde dla tablicy kolorow majacej bialy wierzcholek
  533. bool sprawdzCzyTablicaKolorowMaNieodwiedzonyWierzcholek(int * kolory,int size)
  534. {
  535. for(int i=0;i<size;i++)
  536. {
  537. if(kolory[i]==0)
  538. {
  539. return true;
  540. }
  541. }
  542. return false;
  543. }
  544.  
  545. void wypisywanieTECHNICZNE(int * kolory,int size)
  546. {
  547. for(int i=0;i<size;i++)
  548. {
  549. cout<<kolory[i]<<" ";
  550. }
  551. cout<<endl;
  552. }
  553.  
  554.  
  555. ///@attention wierzcholki do starting point liczymy od 0 a size-1 jest to ostatni !
  556. /// \param listaSasiedzctwa lista sasiedzctwa
  557. /// \param size ilosc wierzcholkow
  558. /// \param startingPoint wierzcholek w ktorym zaczynamy przechodzenie grafu
  559. /// \return najkrotsza sciezka
  560.  
  561.  
  562. Node * algorytmPrima(Node ** listaSasiedzctwa, int size , int startingPoint)
  563. {
  564. Node * wynikowa= nullptr;
  565. int * tablicaKolorow=new int[size];
  566. for(int i=0;i<size;i++)
  567. {
  568. tablicaKolorow[i]=0;
  569. }
  570. for(int i=0;i<size;i++)
  571. {
  572. Node* p=listaSasiedzctwa[i];
  573. while(p!= nullptr)
  574. {
  575. p->from=i;
  576. p=p->next;
  577. }
  578. }
  579.  
  580. tablicaKolorow[startingPoint]=1; // odwiedzamy pierwszy wierzchołek
  581. cout<<"Mam tablice kolorow oraz startowy punkt"<<startingPoint<<endl;
  582. while(sprawdzCzyTablicaKolorowMaNieodwiedzonyWierzcholek(tablicaKolorow,size))
  583. {
  584. double minimalnyPKT=DBL_MAX;
  585. Node * kandydat= nullptr;
  586. cout<<"Przejscie petli"<<endl;
  587. for(int i =0 ;i < size;i++)
  588. {
  589.  
  590. if(tablicaKolorow[i]!=0)
  591. {
  592. Node * p = listaSasiedzctwa[i];
  593.  
  594. while(p!= nullptr)
  595. {
  596. cout<<"przechodze po liscie "<<i<<"I jestem w elemencie"<<p->val<<" wskazujacym na kolor"<<tablicaKolorow[p->to]<<endl;
  597. if(p->val<minimalnyPKT&&tablicaKolorow[p->to]==0) // sprawdza poprawną drogę do nieodwiedzonego wierzchołka
  598. {
  599.  
  600. kandydat=p;
  601. minimalnyPKT=kandydat->val;
  602. cout<<"NADPISANO ("<<p->val<<")"<<endl;
  603. }
  604. p=p->next;
  605. }
  606.  
  607. }
  608.  
  609. }
  610.  
  611. wypisywanieTECHNICZNE(tablicaKolorow,size);
  612. tablicaKolorow[kandydat->to]=1;
  613.  
  614. cout<<"Dodano krawedz o wielkosci "<<kandydat->val<<"<<<<<<<<<<<<<<<<<<<"<<endl;
  615. add(wynikowa,kandydat);
  616. }
  617.  
  618. return wynikowa;
  619. }
  620.  
  621.  
  622.  
  623. ///@attention Lista unikalnych krawedzi moze być wykorzystywana do algorytmu kruskala
  624. /// \param macierzSasiedztwa
  625. /// \return
  626.  
  627. Node * stworzNaBazieMacierzySasiedzctwaListeUnikalnychKrawedzi( Graf_MacierzSasiedztwa *macierzSasiedztwa)
  628. {
  629. Node * head= nullptr;
  630. for (int i = 0; i < macierzSasiedztwa->size; i++)
  631. for (int j = 0; j < i; j++)
  632. if (macierzSasiedztwa->matrix[i][j] != 0)
  633. add(head,i, j, macierzSasiedztwa->matrix[i][j]);
  634. return head;
  635. }
  636.  
  637. //////// KOLOKWIUM ////////////
  638. //////Zadanie 1 /////////
  639. void zadanie1(Node ** &listaSasiedzctwa,int rozmiar)
  640. {
  641. int liczbaUsunetych=0;
  642. double srednia=0;
  643. double suma=0;
  644. int iloscElementow=0;
  645. for(int i=0;i<rozmiar;i++) ///zlicza sume elementow i liczbe elementow w liscie sasiedzctwa
  646. {
  647. Node * p= listaSasiedzctwa[i];
  648.  
  649. while(p!= nullptr)
  650. {
  651. suma+=p->val;
  652. iloscElementow+=1;
  653. p=p->next;
  654. }
  655. }
  656.  
  657. srednia=suma/iloscElementow;
  658. double wartoscKandydata=DBL_MAX;
  659.  
  660. for(int i=0;i<rozmiar;i++)
  661. {
  662. Node * p=listaSasiedzctwa[i];
  663.  
  664. while(p!= nullptr)
  665. {
  666. if(abs(srednia-wartoscKandydata)>p->val)/// warunek na bliskosc do sredniej
  667. {
  668. wartoscKandydata=p->val;
  669. }
  670. p=p->next;
  671. }
  672. }
  673.  
  674. for (int i = 0; i < rozmiar; i++) {//usuwanie wszystkich
  675. Node *p= listaSasiedzctwa[i];
  676. if(wartoscKandydata==p->val)
  677. {
  678. Node * k=p;
  679. p=p->next;
  680. delete k;
  681. }
  682. while(p!= nullptr&&p->next)
  683. {
  684. if(p->next->val==wartoscKandydata)
  685. {
  686. Node *tymczasowa=p->next;
  687. p->next=p->next->next;
  688. delete tymczasowa;
  689. liczbaUsunetych++;
  690. }
  691. p=p->next;
  692. }
  693. }
  694. cout<<endl<<"Liczba usunietych krawedzi "<<liczbaUsunetych<<endl;
  695. }
  696. ///////Zadanie 2////////
  697.  
  698. void zadanie2(Node** ListaSasiedztwa, int macierz[8][8], Node*& ListaKrawedzi, int rozmiar)
  699. {
  700. for (int i = 0; i < rozmiar; i++)
  701. {
  702.  
  703. while (ListaSasiedztwa[i] != nullptr)
  704. {
  705. if ((int) ListaSasiedztwa[i]->val % 2 == 0)
  706. {
  707. Node* tymczasowa1 = ListaKrawedzi;
  708. ListaKrawedzi = new Node;
  709. ListaKrawedzi->from = i;
  710. ListaKrawedzi->to = ListaSasiedztwa[i]->to;
  711. ListaKrawedzi->val = ListaSasiedztwa[i]->val;
  712. ListaKrawedzi->next = tymczasowa1;
  713. Node* tymczasowa2 = ListaSasiedztwa[i];
  714. ListaSasiedztwa[i] = ListaSasiedztwa[i]->next;
  715. delete tymczasowa2;
  716. }
  717. else
  718. {
  719. Node* tymczasowa = ListaSasiedztwa[i];
  720. macierz[i][tymczasowa->to] = tymczasowa->val;
  721. ListaSasiedztwa[i] = ListaSasiedztwa[i]->next;
  722. delete tymczasowa;
  723. }
  724. }
  725. }
  726.  
  727. }
  728. int main()
  729. {
  730. Graf_MacierzSasiedztwa* gr = CzytajGraf("D:\\Grafy\\graf.txt");
  731. WypiszGraf(gr);
  732. Node ** listaSasiedzctwa= listaSasiedztwa(gr->matrix, gr->size);
  733.  
  734.  
  735. Node * lista1= algorytmPrima(listaSasiedzctwa, gr->size, 7);
  736.  
  737. cout<<"Wyszlo";
  738. gr = CzytajGraf("D:\\Grafy\\graf.txt");
  739.  
  740. show_list_rek(lista1);
  741. cout<<endl;
  742. WypiszGraf(gr);
  743. Node * listaKrawedzi=stworzNaBazieMacierzySasiedzctwaListeUnikalnychKrawedzi(gr);
  744. listaSasiedzctwa= listaSasiedztwa(gr->matrix, gr->size);
  745. cout<<endl<<endl;
  746. for(int i=0;i<gr->size;i++)
  747. {
  748. Node *p= listaSasiedzctwa[i];
  749. show_list_rek(p);
  750. cout<<endl;
  751. }
  752. zadanie1(listaSasiedzctwa,gr->size);
  753. cout<<endl;
  754.  
  755. listaSasiedzctwa = listaSasiedztwa(gr->matrix, gr->size);
  756. int matrix[8][8];
  757. for (int i = 0; i < 8; i++)
  758. for (int j = 0; j < 8; j++)
  759. matrix[i][j] = 0;
  760.  
  761. listaKrawedzi = nullptr;
  762. zadanie2(listaSasiedzctwa, matrix, listaKrawedzi, 8);
  763. show_list_rek(listaKrawedzi);
  764. for (int i = 0; i < 8; i++)
  765. {
  766. cout << endl;
  767. for (int j = 0; j < 8; j++)
  768. cout << matrix[i][j] << " ";
  769. }
  770. return 0;
  771. }
  772.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement