Guest User

Untitled

a guest
Nov 23rd, 2018
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.07 KB | None | 0 0
  1. /*
  2. JAQUELINE DE LIMA MATRICULA 170404 E-MAIL 170404@upf.br
  3. THAINÁ CAGLIONI MATRICULA 158286 E-MAIL 158286@upf.br
  4. VITOR LANGARO BALOTIN MATRICULA 163252 E-MAIL 163252@upf.br
  5. */
  6. #include <iostream>
  7. #include <algorithm>
  8. #include <fstream>
  9. #include <string>
  10. #include <list>
  11. #include <vector>
  12.  
  13. using namespace std;
  14.  
  15. struct Vertice;
  16.  
  17. struct Aresta{
  18. string rotulo;
  19. int custo;
  20. Vertice *ver1;
  21. Vertice *ver2;
  22. int vis=0;
  23. };
  24.  
  25. struct Vertice{
  26. string rotulo;
  27. int vis=0;
  28. int grau=0;
  29. };
  30.  
  31. struct Arv{
  32. string rotulo;
  33. string rotulo2;
  34. string rotuloant;
  35. int custo;
  36. bool vis=false;
  37. };
  38. struct circ{
  39. int grau=0;
  40. Vertice *ver;
  41. Aresta *ar;
  42. };
  43.  
  44. int m=0;
  45.  
  46. char menu()
  47. {
  48. if(m==0){
  49. cout << "Alunos = Jaqueline de Lima, Thaina Caglioni e Vitor Langaro Balotin\n"
  50. << "E-mail = 170404@upf.br , 158286@upf.br , 163252@upf.br \n";
  51. m++;
  52. }
  53. cout << "L - Leitura\n"
  54. << "A - Arvore geradora minima\n"
  55. << "G - Grau\n"
  56. << "V - Vertices finais\n"
  57. << "I - Incidencia\n"
  58. << "C - Circuito\n"
  59. << "S - Sequencia de graus\n"
  60. << "F - Fim\n"
  61. << "Digite a opcao desejada: ";
  62.  
  63. char op;
  64. cin >> op;
  65. op = toupper(op);
  66. return op;
  67. }
  68.  
  69. void leitura(list<Vertice>& ver, list<Aresta>& ares){
  70. string v1, v2;
  71. Vertice auxver;
  72. Aresta auxares;
  73. ifstream txt("XISPA.txt");
  74. if(!txt){
  75. cout << "Nao foi encontrado o arquivo. Verfique o nome(deve ser XISPA).\n";
  76. return;
  77. }
  78. else{
  79. int n;
  80. txt >> n;
  81. for(int i=0; i<n; i++){
  82. txt >> auxver.rotulo;
  83. auxver.vis=0;
  84. ver.push_back(auxver);
  85. }
  86. txt >> n;
  87. for(int i=0; i<n; i++){
  88. txt >> auxares.rotulo >> v1 >> v2 >> auxares.custo;
  89. if(v1==v2){
  90. cout << "Vertices iguais, nao e possivel inserir aresta.\n";
  91. return;
  92. }
  93. else{
  94. for(auto it=ver.begin(); it!=ver.end(); it++){
  95. if(it->rotulo == v1){
  96. auxares.ver1=&*it;
  97. }
  98. if(it->rotulo == v2){
  99. auxares.ver2=&*it;
  100. }
  101. }
  102. ares.push_back(auxares);
  103. }
  104. }
  105. }
  106. }
  107.  
  108. void arv_ger_min(list<Arv> arvg, list<Vertice> ver, list<Aresta> ares){
  109. Arv auxar;
  110. cout << "Digite o vertice: ";
  111. string vp;
  112. cin >> vp;
  113. for(auto it=ver.begin(); it!=ver.end(); it++){
  114. auxar.rotulo=it->rotulo;
  115. auxar.custo=0;
  116. auxar.rotuloant="NULL";
  117. arvg.push_back(auxar);
  118. }
  119. for(auto it=ares.begin(); it!=ares.end(); it++){
  120. if(it->ver1->rotulo==vp || it->ver2->rotulo == vp){
  121. if(it->ver2->rotulo==vp){
  122. auxar.rotulo=it->ver1->rotulo;
  123. auxar.rotuloant=it->ver2->rotulo;
  124. auxar.custo=it->custo;
  125. }
  126. else{
  127. auxar.rotulo=it->ver2->rotulo;
  128. auxar.rotuloant=it->ver1->rotulo;
  129. auxar.custo=it->custo;
  130. }
  131. }
  132. else{
  133. auxar.rotulo=it->ver1->rotulo;
  134. auxar.rotuloant=it->ver2->rotulo;
  135. auxar.rotulo2=it->ver2->rotulo;
  136. auxar.custo=it->custo;
  137. }
  138. for(auto ita=arvg.begin(); ita!=arvg.end(); ita++){
  139. if(ita->rotulo==auxar.rotulo || ita->rotulo==auxar.rotulo2){
  140. if(ita->rotulo==auxar.rotulo2){
  141. if(ita->vis==false){
  142. ita->rotuloant=auxar.rotulo;
  143. ita->custo=auxar.custo;
  144. ita->vis=true;
  145. //break;
  146. }
  147. else{
  148. if(ita->custo > auxar.custo){
  149. ita->rotuloant=auxar.rotulo;
  150. ita->custo=auxar.custo;
  151. //break;
  152. }
  153. }
  154. }
  155. else{
  156. if(ita->vis==false){
  157. ita->rotuloant=auxar.rotuloant;
  158. ita->custo=auxar.custo;
  159. ita->vis=true;
  160. //break;
  161. }
  162. else{
  163. if(ita->custo > auxar.custo){
  164. ita->rotuloant=auxar.rotuloant;
  165. ita->custo=auxar.custo;
  166. //break;
  167. }
  168. }
  169. }
  170. }
  171. }
  172. }
  173. cout << "-------------------------------------" << endl;
  174. for(auto it=arvg.begin(); it!=arvg.end(); it++){
  175. cout << it->rotulo << " " << it->rotuloant << " " << it->custo << endl;
  176. }
  177. cout << "-------------------------------------" << endl;
  178.  
  179. }
  180.  
  181. void grau(list<Aresta> ares, list<Vertice> ver){
  182. cout << "Digite o rotulo do vertice a ser pesquisado: ";
  183. string vp;
  184. int grau=0;
  185. cin >> vp;
  186. if(ver.empty()){
  187. cout << "Nao ha vertices no grafo.\n";
  188. return;
  189. }
  190. for(auto it=ares.begin(); it!=ares.end(); it++){
  191. if(it->ver1->rotulo == vp /*|| it->ver2->rotulo == vp*/){
  192. it->ver1->grau=grau++;
  193. }
  194. if(it->ver2->rotulo==vp){
  195. it->ver2->grau=grau++;
  196. }
  197. }
  198. cout << "O grau e: " << grau << endl;
  199. }
  200.  
  201. void ver_finais(list <Aresta> ares, list<Vertice> ver){
  202. vector<string> verf;
  203. for(auto itv=ver.begin(); itv!=ver.end(); itv++){
  204. for(auto ita=ares.begin(); ita!=ares.end(); ita++){
  205. if(itv->rotulo == ita->ver1->rotulo || itv->rotulo == ita->ver2->rotulo){
  206. itv->vis++;
  207. }
  208. }
  209. }
  210. for(auto p=ver.begin(); p!=ver.end(); p++){
  211. if(p->vis == 1)
  212. verf.push_back(p->rotulo);
  213. }
  214. if(verf.empty()){
  215. cout << "Nao ha vertices finais\n";
  216. return;
  217. }
  218. else{
  219. for(auto n:verf){
  220. cout << n << endl;
  221. }
  222. }
  223. }
  224.  
  225. void incidencia(list<Aresta> ares){
  226. vector<string> ari;
  227. if(ares.empty()){
  228. cout << "Nao ha vertices\n";
  229. return;
  230. }
  231. string vp;
  232. int i=0;
  233. cout << "Digite o aresta: ";
  234. cin >> vp;
  235. for(auto ita=ares.begin(); ita!=ares.end(); ita++){
  236. if(ita->rotulo == vp || ita->rotulo == vp){
  237. string ar=ita->ver1->rotulo;
  238. ari.push_back(ar);
  239. ar=ita->ver2->rotulo;
  240. ari.push_back(ar);
  241. i++;
  242. }
  243. }
  244. if(i==0){
  245. cout << "Nao ha arestas nesse aresta\n";
  246. }
  247. else{
  248. for(auto n:ari){
  249. cout << n << endl;
  250. }
  251. }
  252. }
  253.  
  254. void circuito(list<Aresta> ares, list<Vertice> ver/*, list<circ> cir*/){
  255.  
  256. cout << "Nao deu\n";
  257. /*vector<string> ar;
  258. vector<string> v;
  259. for(auto itv=ver.begin(); itv!=ver.end(); itv++){
  260. if(itv->grau <= 2){
  261. for(auto ita=ares.begin(); ita!=ares.end(); ita++){
  262. if(itv->rotulo==ita->ver1->rotulo)
  263. }
  264. }
  265. for(auto ita=ares.begin(); ita!=ares.end(); ita++){
  266. if(itv->rotulo==ita->ver1->rotulo){
  267. aux.ver=ita->ver1;
  268. aux.grau=grau+1;
  269. aux.ar=&*ita;
  270. }
  271. if(itv->rotulo==ita->ver2->rotulo){
  272. aux.ver=ita->ver2;
  273. aux.grau=grau+1;
  274. aux.ar=&*ita;
  275. }
  276. }
  277. cir.push_back(aux);
  278. }
  279. for(auto it=cir.begin(); it!=cir.end(); it++){
  280. cout << it->ver->rotulo << endl
  281. << it->grau << endl
  282. << it->ar->rotulo << endl;
  283. }*/
  284. }
  285.  
  286. void seq_graus(list<Aresta> ares, list<Vertice> ver){
  287. vector<int> graus;
  288. for(auto itv=ver.begin(); itv!=ver.end(); itv++){
  289. int grau=0;
  290. for(auto ita=ares.begin(); ita!=ares.end(); ita++){
  291. if(itv->rotulo == ita->ver1->rotulo || itv->rotulo == ita->ver2->rotulo){
  292. grau++;
  293. }
  294. }
  295. graus.push_back(grau);
  296. }
  297. sort(graus.rbegin(), graus.rend());
  298. for(auto n:graus){
  299. cout << n << " ";
  300. }
  301. cout << endl;
  302. }
  303.  
  304. int main(){
  305. list<Arv> arvg;
  306. list<Aresta> ares;
  307. list<Vertice> ver;
  308. //list<circ> cir;
  309. char op;
  310. do{
  311. op=menu();
  312. switch(op){
  313. case 'L':leitura(ver, ares);
  314. break;
  315. }
  316. switch(op){
  317. case 'A':arv_ger_min(arvg, ver, ares);
  318. break;
  319. }
  320. switch(op){
  321. case 'G':grau(ares, ver);
  322. break;
  323. }
  324. switch(op){
  325. case 'V':ver_finais(ares, ver);
  326. break;
  327. }
  328. switch(op){
  329. case 'I':incidencia(ares);
  330. break;
  331. }
  332. switch(op){
  333. case 'C':circuito(ares, ver/*, cir*/);
  334. break;
  335. }
  336. switch(op){
  337. case 'S':seq_graus(ares, ver);
  338. break;
  339. }
  340. }while(op != 'F');{
  341. cout << "Programa finalizado com sucesso!\n";
  342. }
  343. return 0;
  344. }
Add Comment
Please, Sign In to add comment