Hypereq

A10

Dec 1st, 2022
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.59 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <windows.h>
  5. #include <string.h>
  6. #include <vector>
  7. #include <algorithm>
  8. #include <fstream>
  9. #include <string>
  10.  
  11. using namespace std;
  12. #define MAX 21
  13.  
  14. // string wczytujacy z pliku
  15. string wcz;
  16.  
  17. // wyswietla liste
  18. void wyswietlListe(vector<vector<int>> lista, int liczbaWierzcholkow)
  19. {
  20. cout << endl;
  21. for (int i = 1; i < liczbaWierzcholkow + 1; i++)
  22. {
  23. cout << i;
  24.  
  25. if (lista[i].size() == 0)
  26. {
  27. cout << " -";
  28. }
  29. else
  30. {
  31. for (int j : lista[i])
  32. {
  33. cout << " -> " << j;
  34. }
  35. }
  36. cout << endl;
  37. }
  38. cout << endl;
  39. }
  40.  
  41. // wyswietla macierz
  42. void wyswietlMacierz(vector<vector<int>> macierz, int liczbaWierzcholkow)
  43. {
  44. cout << endl << " ";
  45.  
  46. for(int i = 1; i < 10; i++)
  47. {
  48. cout << i << " ";
  49. }
  50.  
  51. for(int i = 10; i <= liczbaWierzcholkow; i++)
  52. {
  53. cout << i << " ";
  54. }
  55.  
  56. cout << endl << " -";
  57.  
  58. for(int i = 0; i < liczbaWierzcholkow; i++)
  59. {
  60. cout << "----";
  61. }
  62.  
  63. cout << endl;
  64.  
  65. for (int i = 1; i < liczbaWierzcholkow+1; i++)
  66. {
  67. if(i >= 10)
  68. {
  69. cout << i << "| ";
  70. }
  71. else
  72. {
  73. cout << i << " | ";
  74. }
  75.  
  76. for (int j = 1; j < liczbaWierzcholkow+1; j++)
  77. {
  78. cout << macierz[i][j] << " ";
  79. }
  80. cout << endl;
  81. }
  82. cout << endl;
  83. }
  84.  
  85. // dlugosc stringa
  86. int len(string wcz)
  87. {
  88. int dlugosc = 0;
  89. for (int i = 0; wcz[i] != '\0'; i++)
  90. {
  91. dlugosc++;
  92. }
  93. return dlugosc;
  94. }
  95.  
  96. // dzielenie stringa
  97. vector<int> dzielenie(string wcz, char separator)
  98. {
  99. vector <int> temp;
  100. int obecnyIndex = 0, i = 0;
  101. int poczIndex = 0, koncowyIndex = 0;
  102. while (i <= len(wcz))
  103. {
  104. if (wcz[i] == separator || i == len(wcz))
  105. {
  106. koncowyIndex = i;
  107. string dodatkowystring = "";
  108. dodatkowystring.append(wcz, poczIndex, koncowyIndex - poczIndex);
  109. temp.push_back(stoi(dodatkowystring));
  110. obecnyIndex++;
  111. poczIndex = koncowyIndex + 1;
  112. }
  113. i++;
  114. }
  115. return temp;
  116. }
  117.  
  118. vector<vector<int>> wczytaj(char separator, vector<vector<int>> &macierz, vector<vector<int>> &lista, int &liczbaWierzcholkow)
  119. {
  120. string fileName;
  121. string fullFileName;
  122. liczbaWierzcholkow = 0;
  123.  
  124. cout << endl << "PODAJ NAZWE PLIKU: ";
  125. getline(cin >> ws, fileName);
  126. //fullFileName = "C:\\Users\\Patryk\\Desktop\\" + fileName + ".txt";
  127. fullFileName = fileName + ".txt";
  128. // fullFileName = "3.txt";
  129.  
  130. ifstream file;
  131. file.open(fullFileName, ios::in);
  132.  
  133. if (file.is_open() == false)
  134. {
  135. cout << "TAKI PLIK NIE ISTNIEJE" << endl;
  136. cout << "ZAKONCZONO PRACE PROGRAMU";
  137. exit(0);
  138. }
  139.  
  140. while (!file.eof())
  141. {
  142. getline(file, wcz);
  143. liczbaWierzcholkow++;
  144. vector<int> wczytane = dzielenie(wcz, separator);
  145.  
  146. for (int i = 1; i < wczytane.size(); i++ )
  147. {
  148. lista[wczytane[0]].push_back(wczytane[i]);
  149. macierz[wczytane[0]][wczytane[i]]++;
  150. }
  151. }
  152. file.close();
  153. return macierz;
  154. }
  155.  
  156. void zapisz(vector<vector<int>> lista, int liczbaWierzcholkow)
  157. {
  158. string fileName;
  159. string fullFileName;
  160.  
  161. cout << endl << "PODAJ NAZWE PLIKU: ";
  162. getline(cin >> ws, fileName);
  163. //fullFileName = "C:\\Users\\Patryk\\Desktop\\" + fileName + ".txt";
  164. fullFileName = fileName + ".txt";
  165.  
  166. fstream file;
  167. file.open(fullFileName, ios::out);
  168.  
  169. for (int i = 1; i < liczbaWierzcholkow+1; i++)
  170. {
  171. file << i;
  172.  
  173. for (auto j : lista[i])
  174. {
  175. file << "," << j;
  176. }
  177.  
  178. if(i == liczbaWierzcholkow)
  179. {
  180. break;
  181. }
  182. else
  183. {
  184. file << endl;
  185. }
  186. }
  187. file.close();
  188. }
  189.  
  190. bool jedenGraf(vector<vector<int>> macierz, int liczbaWierzcholkow)
  191. {
  192. for(int i = 1; i < liczbaWierzcholkow +1; i++)
  193. {
  194. for(int j= 1; j< liczbaWierzcholkow + 1; j++)
  195. {
  196. if(macierz[i][j] > 1)
  197. {
  198. return false;
  199. }
  200. }
  201. }
  202. return true;
  203. }
  204.  
  205. bool sprzezenie(vector<vector<int>> macierz, int liczbaWierzcholkow)
  206. {
  207. for(int i = 1; i < liczbaWierzcholkow + 1; i++)
  208. {
  209. for(int j = i+1; j < liczbaWierzcholkow + 1; j++)
  210. {
  211. if(!(macierz[i] == macierz[j]))
  212. {
  213. for(int k = 1; k < liczbaWierzcholkow + 1; k++)
  214. {
  215. if(macierz[i][k] && macierz[j][k])
  216. {
  217. return false;
  218. }
  219. }
  220. }
  221. }
  222. }
  223. return true;
  224. }
  225.  
  226. void wyswietlWektor(const vector<int> &macierz)
  227. {
  228. for (auto wartosc : macierz)
  229. {
  230. cout << wartosc << " ";
  231. }
  232. cout << endl;
  233. }
  234.  
  235. bool liniowy(vector<vector<int>> macierz, int liczbaWierzcholkow)
  236. {
  237. for(int i = 1; i < liczbaWierzcholkow + 1; i++)
  238. {
  239. for(int j = i + 1; j < liczbaWierzcholkow + 1; j++)
  240. {
  241. bool A = true;
  242. bool B = false;
  243. bool C = true;
  244.  
  245. if(macierz[i] == macierz[j])
  246. {
  247. B = true;
  248. }
  249.  
  250. for(int k = 1; k <liczbaWierzcholkow + 1; k++)
  251. {
  252. if(macierz[i][k] && macierz[j][k])
  253. {
  254. A = false;
  255. }
  256. if(macierz[k][i] && macierz[k][j])
  257. {
  258. C = false;
  259. }
  260. }
  261. if(!(A || (B && C)))
  262. {
  263. return false;
  264. }
  265. }
  266. }
  267. return true;
  268. }
  269.  
  270. vector<vector<int>> transformacja(vector<vector<int>> macierz, int liczbaWierzcholkow)
  271. {
  272. int licznik = 1;
  273. int licznikIndexowania = 1;
  274. int licznikSortowania = 0;
  275. int tempC = 0;
  276. vector<int> tablicaDoSortowania;
  277. vector<vector<int>> tablicaWierzcholkow(MAX);
  278. vector<vector<int>> listaTransformacja(MAX);
  279. vector<vector<int>> kopiaListy(MAX);
  280.  
  281. // tworzy luki dotyczace wierzcholkow
  282.  
  283. for(int i = 1; i < liczbaWierzcholkow + 1; i++)
  284. {
  285. tablicaWierzcholkow[i].push_back(licznik);
  286. tablicaWierzcholkow[i].push_back(licznik + 1);
  287. licznik += 2;
  288. }
  289.  
  290. for(int i = 1; i < liczbaWierzcholkow + 1; i++)
  291. {
  292. for(int j = 1; j < liczbaWierzcholkow + 1; j++)
  293. {
  294. if(macierz[i][j] == 1)
  295. {
  296. int tempA = tablicaWierzcholkow[j][0]; // zawiera liczbe jaka mial wierzcholek przed zmiana
  297. int tempB = tablicaWierzcholkow[i][1]; // zawiera liczbe na jaka musi zmienic sie wierzcholek
  298.  
  299. tablicaWierzcholkow[j][0] = tablicaWierzcholkow[i][1];
  300.  
  301. for(int k = 1; k < liczbaWierzcholkow + 1; k++)
  302. {
  303. if(tablicaWierzcholkow[k][0] == tempA)
  304. {
  305. tablicaWierzcholkow[k][0] = tempB;
  306. }
  307.  
  308. if(tablicaWierzcholkow[k][1] == tempA)
  309. {
  310. tablicaWierzcholkow[k][1] = tempB;
  311. }
  312. }
  313. }
  314. }
  315. }
  316.  
  317. kopiaListy = tablicaWierzcholkow;
  318.  
  319. for(int i = 1; i < liczbaWierzcholkow + 1; i++)
  320. {
  321. tablicaDoSortowania.push_back(tablicaWierzcholkow[i][0]);
  322. tablicaDoSortowania.push_back(tablicaWierzcholkow[i][1]);
  323. }
  324.  
  325. sort(tablicaDoSortowania.begin(), tablicaDoSortowania.end());
  326. tablicaDoSortowania.erase(unique(tablicaDoSortowania.begin(), tablicaDoSortowania.end()), tablicaDoSortowania.end());
  327.  
  328. for(int i = 1; i < liczbaWierzcholkow + 1; i++)
  329. {
  330. for(int j = 1; j < liczbaWierzcholkow + 1; j++)
  331. {
  332. if(tablicaWierzcholkow[j][0] == tablicaDoSortowania[licznikSortowania])
  333. {
  334. tablicaWierzcholkow[j][0] = licznikIndexowania;
  335. }
  336. if(tablicaWierzcholkow[j][1] == tablicaDoSortowania[licznikSortowania])
  337. {
  338. tablicaWierzcholkow[j][1] = licznikIndexowania;
  339. }
  340. }
  341. licznikSortowania++;
  342. licznikIndexowania++;
  343. }
  344.  
  345. for(int i = 1; i < liczbaWierzcholkow + 1; i++)
  346. {
  347. listaTransformacja[tablicaWierzcholkow[i][0]].push_back(tablicaWierzcholkow[i][1]);
  348. }
  349.  
  350. return listaTransformacja;
  351. }
  352.  
  353.  
  354. int main()
  355. {
  356. // liczenie wierzcholkow
  357. int liczbaWierzcholkow = 0;
  358.  
  359. char separator = ',';
  360. char menu = '1';
  361. char menuwpis[5];
  362. int dlugoscmenu;
  363.  
  364. vector<vector<int>> listsasiedztwa(MAX);
  365. vector<vector<int>> macierzsasiedztwa(MAX);
  366. vector<vector<int>> listasasiedztwaTransformacja(MAX);
  367.  
  368. // uzupelnienie macierzy 0
  369.  
  370. for (int i = 0; i < MAX; i++)
  371. {
  372. for (int j = 0; j < MAX; j++)
  373. {
  374. macierzsasiedztwa[i].push_back(0);
  375. }
  376. }
  377.  
  378. while (menu != 'X')
  379. {
  380.  
  381. cout << endl << "----------------------------------------" << endl;
  382. cout << "MENU GLOWNE:" << endl << endl;
  383. cout << "1 - WCZYTAJ GRAF" << endl;
  384. cout << "2 - ZAPISZ GRAF" << endl;
  385. cout << "3 - WYSWIETL LISTE NASTEPNIKOW" << endl;
  386. cout << "4 - WYSWIETL MACIERZ SASIEDZTWA" << endl;
  387. cout << "5 - ALGORYTM" << endl;
  388. cout << "X - ZAKONCZ DZIALANIE PROGRAMU" << endl;
  389. cout << "----------------------------------------" << endl << endl;
  390.  
  391. fflush(stdin);
  392. cin >> menuwpis;
  393.  
  394. dlugoscmenu = strlen(menuwpis);
  395.  
  396. if (dlugoscmenu > 1)
  397. {
  398. cout << "WYBRANO NIEISTNIEJACY TRYB - SPROBUJ PONOWNIE";
  399. continue;
  400. }
  401. else
  402. {
  403. menu = menuwpis[0];
  404. }
  405.  
  406. switch (menu)
  407. {
  408. case '1':
  409. wczytaj(separator, macierzsasiedztwa, listsasiedztwa, liczbaWierzcholkow);
  410. cout << endl << "WCZYTANO POMYSLNIE GRAF" << endl;
  411. break;
  412.  
  413. case '2':
  414. zapisz(listsasiedztwa, liczbaWierzcholkow);
  415. cout << endl << "POMYSLNIE ZAPISANO GRAF" << endl;
  416. break;
  417.  
  418. case '3':
  419. cout << endl << "LISTA NASTEPNIKOW:" << endl;
  420. wyswietlListe(listsasiedztwa, liczbaWierzcholkow);
  421. break;
  422.  
  423. case '4':
  424. cout << endl << "MACIERZ SASIEDZTWA:" << endl;
  425. wyswietlMacierz(macierzsasiedztwa, liczbaWierzcholkow);
  426. break;
  427.  
  428. case '5':
  429. if(jedenGraf(macierzsasiedztwa, liczbaWierzcholkow))
  430. {
  431. cout << endl << "TEN GRAF JEST 1-GRAFEM";
  432. if(sprzezenie(macierzsasiedztwa, liczbaWierzcholkow))
  433. {
  434. cout << endl << "TEN GRAF JEST SPRZEZONY ";
  435. if(liniowy(macierzsasiedztwa,liczbaWierzcholkow))
  436. {
  437. cout << "I LINIOWY";
  438. }
  439. else
  440. {
  441. cout << "I NIE JEST LINIOWY";
  442. }
  443.  
  444. listasasiedztwaTransformacja = transformacja(macierzsasiedztwa, liczbaWierzcholkow);
  445. cout << endl << "TRANSFORMACJA PRZEBIEGLA POMYSLNIE";
  446.  
  447. cout << endl << "GRAF ORYGINALNY:"; // POPRAWIC ZAPIS
  448. wyswietlListe(listasasiedztwaTransformacja, liczbaWierzcholkow);
  449. }
  450. else
  451. {
  452. cout << endl << "TEN GRAF NIE JEST SPRZEZONY I NIE JEST LINIOWY";
  453. }
  454. }
  455. else
  456. {
  457. cout << endl << "TEN GRAF NIE JEST 1-GRAFEM, WIEC NIE JEST SPRZEZONY I NIE JEST LINIOWY";
  458. }
  459. break;
  460.  
  461. case 'X':
  462. printf("\nZAKONCZONO PRACE PROGRAMU\n");
  463. break;
  464.  
  465. case 'x':
  466.  
  467. printf("\nZAKONCZONO PRACE PROGRAMU\n");
  468. return 0;
  469.  
  470. default:
  471. printf("\nWYBRANO NIEISTNIEJACY TRYB - SPROBUJ PONOWNIE\n");
  472. break;
  473. }
  474. }
  475.  
  476. return 0;
  477. }
Advertisement
Add Comment
Please, Sign In to add comment