diff --git a/algorithms/CPlusPlus/Sorting/topological-sort.cpp b/algorithms/CPlusPlus/Sorting/topological-sort.cpp new file mode 100644 index 00000000..1e8533f8 --- /dev/null +++ b/algorithms/CPlusPlus/Sorting/topological-sort.cpp @@ -0,0 +1,238 @@ +#include +#include + +using namespace std; + +// Classes +class Lista { + public: + int lista[100]; + int tamanho; + Lista(); + void inserir(int valor); +}; + +class StringArray { + public: + string strings[100]; + int tamanho; + StringArray(); + void add(string c); + void printArray(); + Lista parse(int i); + Lista handleNumber(string line, int i); +}; + +class GrausDeEntrada { + public: + int tamanho; + GrausDeEntrada(); + int graus[100]; + void printGraus(); +}; + +class Grafo { + public: + Lista listaRelacoes[100]; + int tamanhoListaRelacoes; + void inserirNaLista(Lista lista); + Grafo(); + void parse(StringArray SA); + void printRelacoes(); + void findGraus(GrausDeEntrada& g); + void reduzirGrau(GrausDeEntrada& g); + bool isAllZero(GrausDeEntrada g); + int listaOrdenada[100]; + void adicionarNaListaOrdenada(int valor); + int tamanhoListaOrdenada; + void printListaOrdenada(); +}; + +// Construtores +GrausDeEntrada:: GrausDeEntrada(){ + this->tamanho = 0; +}; + +Lista:: Lista(){ + tamanho = 0; +}; + +Grafo:: Grafo(){ + this->tamanhoListaRelacoes = 0; + this->tamanhoListaOrdenada = 0; +}; + +StringArray:: StringArray(){ + this->tamanho = 0; +}; + +// Métodos +bool isNumber(string s){ + return std::any_of(s.begin(), s.end(), ::isdigit); +} + +int getNumeroDeVertices(string line){ + int i = 0; + string numeroEmString = ""; + while(line[i] != ' '){ + numeroEmString += line[i]; + i++; + } + return stoi(numeroEmString); +}; + +void Grafo:: findGraus(GrausDeEntrada& g){ + for(int i = 0; i < tamanhoListaRelacoes; i++){ + int vertice = i + 1; + int grau = 0; + for(int k = 0; k < tamanhoListaRelacoes; k++){ + for(int j = 0; j < listaRelacoes[k].tamanho; j++){ + if(listaRelacoes[k].lista[j] == vertice){ + grau++; + } + } + } + g.graus[i] = grau; + g.tamanho++; + } +}; + +void Grafo:: adicionarNaListaOrdenada(int valor){ + listaOrdenada[tamanhoListaOrdenada] = valor; + tamanhoListaOrdenada++; +}; + +void Grafo:: printListaOrdenada(){ + for(int i = 0; i < this->tamanhoListaOrdenada; i++){ + cout << this->listaOrdenada[i] << " "; + } + cout << endl; +} + +void Lista::inserir(int valor){ + lista[tamanho] = valor; + tamanho++; +}; + +void StringArray:: add(string c){ + strings[tamanho] = c; + tamanho++; +}; + +void Grafo:: inserirNaLista(Lista lista){ + this->listaRelacoes[tamanhoListaRelacoes] = lista; + tamanhoListaRelacoes++; +}; + +void StringArray:: printArray(){ + for(int i = 0; i < tamanho; i++){ + cout<< i + 1<<": "<inserirNaLista(lista); + } +}; + +void Grafo:: printRelacoes(){ + for(int i = 0; i < this->tamanhoListaRelacoes; i++){ + cout<<"\n Aresta "<listaRelacoes[i].tamanho; j++){ + cout<listaRelacoes[i].lista[j]<<" "; + } + cout< -1){ + notZero = false; + } + } + return notZero; +}; + +void GrausDeEntrada:: printGraus(){ + for(int i = 0; i < tamanho; i++){ + cout<<"Grau de entrada do vertice "<