Advertisement
Oscar2019

fluxo

May 12th, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.24 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5.  
  6. struct Materia{
  7. string nome;
  8. int creditos;
  9. int numReq;
  10. int codigo;
  11. int id;
  12. };
  13.  
  14. typedef vector<int> vertex; //Abstração Vertices do Grafo
  15. typedef vector<vertex> Grafo; //Abstração o Grafo
  16.  
  17. pair<vector<Materia>, pair<Grafo, Grafo>> graphCreate(string nomeArquivo){
  18.  
  19. pair<vector<Materia>, pair<Grafo, Grafo>> res;
  20. auto &materias = res.first;
  21. auto &grafo = res.second.first;
  22. auto &grafoInverso = res.second.second;
  23. ifstream myfile(nomeArquivo);
  24. string line;
  25. int aux, val1, val2, val3, chave = 0;
  26. map<int, int> mapa1;
  27. vector<int> mapa2;
  28.  
  29. if(myfile.is_open()){ //verifico se o arquivo esta aberto
  30. getline(myfile,line);
  31. aux = stoi(line);
  32. materias.resize(aux);
  33. grafo.resize(aux);
  34. grafoInverso.resize(aux);
  35. mapa2.resize(aux);
  36. for(auto&p : materias){
  37. getline(myfile, p.nome);
  38. getline(myfile, line);
  39. stringstream linha(line);
  40. linha >> val1 >> val2 >> val3;
  41. mapa2[chave] = val1;
  42. mapa1[val1] = chave;
  43. p.creditos = val3;
  44. p.codigo = val1;
  45. p.numReq = val2;
  46. p.id = chave;
  47. ++chave;
  48. }
  49. getline(myfile,line);
  50. aux = stoi(line);
  51. for(int i = 0; i < aux; ++i){
  52. getline(myfile,line);
  53. stringstream linha(line);
  54. linha >> val1 >> val2;
  55. grafo[mapa1[val2]].push_back(mapa1[val1]);
  56. grafoInverso[mapa1[val1]].push_back(mapa1[val2]);
  57. }
  58. myfile.close();
  59. } else {
  60. cout << "Não foi possível abrir o arquivo para criar o fluxo verifique se possui o arquivo materias.txt" << endl;
  61. }
  62. return res;
  63. }
  64.  
  65.  
  66. int main() {
  67.  
  68. auto grafoTotal = graphCreate("materias.txt");
  69. auto &materias = grafoTotal.first;
  70. auto &grafo = grafoTotal.second.first;
  71. auto &grafoInverso = grafoTotal.second.second;
  72.  
  73. stack<int> atuais;
  74. vector<int> preReg(materias.size()), ordem(materias.size());
  75. vector<pair<int, int>> caminhoCritico(materias.size() , {0, 0});
  76.  
  77. int indOrdem = 0;
  78. for(int i = 0; i < materias.size(); ++i){
  79. preReg[i] = materias[i].numReq;
  80. }
  81. for(int i = 0; i < materias.size(); ++i){
  82. if(preReg[i] == 0){
  83. ordem[indOrdem] = i;
  84. ++indOrdem;
  85. }
  86. }
  87. for(int i = 0; i < materias.size(); ++i){
  88. if(preReg[i] == 0){
  89. atuais.push(i);
  90. }
  91. }
  92.  
  93. while (!atuais.empty()){
  94. auto a = atuais.top();
  95. atuais.pop();
  96. for(auto &p: grafo[a]){
  97. if(preReg[p] > 0){
  98. --preReg[p];
  99. }
  100. if(preReg[p] == 0){
  101. preReg[p] = -1;
  102. atuais.push(p);
  103. ordem[indOrdem] = p;
  104. ++indOrdem;
  105. }
  106. }
  107. }
  108.  
  109. for(auto&p : ordem){
  110. cout << "-------------------------\n";
  111. cout << "nome\t" << materias[p].nome << '\n';
  112. cout << "codigo\t" << materias[p].codigo << '\n';
  113. cout << "creditos\t" << materias[p].creditos << '\n';
  114. cout << "Numero de Requisitos\t" << materias[p].numReq << '\n';
  115. cout << "-------------------------\n";
  116. }
  117.  
  118.  
  119. queue<int> fila;
  120. for(int i = 0; i < materias.size(); ++i){
  121. preReg[i] = materias[i].numReq;
  122. }
  123. for(int i = 0; i < materias.size(); ++i){
  124. if(preReg[i] == 0){
  125. fila.push(i);
  126. caminhoCritico[i] = make_pair(materias[i].creditos, -1);
  127. }
  128. }
  129. while (!fila.empty()){
  130. auto a = fila.front();
  131. fila.pop();
  132. for(auto &p: grafo[a]){
  133. if(preReg[p] > 0){
  134. --preReg[p];
  135. }
  136. if(preReg[p] == 0){
  137. preReg[p] = -1;
  138. fila.push(p);
  139. ++indOrdem;
  140. }
  141. if(caminhoCritico[a].first + materias[p].creditos > caminhoCritico[p].first){
  142. caminhoCritico[p].first = caminhoCritico[a].first + materias[p].creditos;
  143. caminhoCritico[p].second = a;
  144. }
  145. }
  146. }
  147. pair<int, int> maximo = {-1, -1};
  148. vector<int> ordemCCritico;
  149. for(int i = 0; i < caminhoCritico.size(); ++i){
  150. auto &p = caminhoCritico[i];
  151. if(p.first > maximo.first){
  152. maximo.first = p.first;
  153. maximo.second = i;
  154. }
  155. }
  156. int proximo = maximo.second;
  157. while(proximo != -1){
  158. ordemCCritico.push_back(proximo);
  159. proximo = caminhoCritico[proximo].second;
  160. }
  161.  
  162. reverse(ordemCCritico.begin(), ordemCCritico.end());
  163. cout << endl << endl;
  164. cout << "O tamanho do caminho critico eh " << ordemCCritico.size() << " com peso " << maximo.first << endl;
  165. for(auto&p : ordemCCritico){
  166. cout << "-------------------------\n";
  167. cout << "nome\t" << materias[p].nome << '\n';
  168. cout << "codigo\t" << materias[p].codigo << '\n';
  169. cout << "creditos\t" << materias[p].creditos << '\n';
  170. cout << "Numero de Requisitos\t" << materias[p].numReq << '\n';
  171. cout << "-------------------------\n";
  172. }
  173.  
  174.  
  175.  
  176.  
  177. return 0;
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement