Witajcie, próbuję znaleźć błąd u mnie w implementacji Sortowania Topologicznego.
Otóż, na początku generuje macierz trójkątną dolną tak aby otrzymac DAG- czyli Skierowany graf Acykliczny. Rezultat wyświetlony jest w konsoli ( tzn macierz. ) nastepnie tę macierz sąsiedztwa przeksztalcam do listy sąsiedztwa dla grafu na której później będę operował ( sortując i przeszukiwując sąsiadów ).
Dokonuje tego w konstruktorze.
#include <iostream>
#include<cstdlib>
#include <stdio.h>
#include<stack>
#include<list>
#include <ctime>
using namespace std;
class TopologicGraph{
int vertex;
list<int> *neighbourList;
public:
TopologicGraph(int** tab, int vert);
void DFSutiling(int vert, bool visited[], stack<int> &stak );
void TopologicSort();
void testPrinter();
};
//generacja
int** generateDAG(int vertex, int percent ){
int** matrix = new int*[vertex];
for (int i = 0; i <vertex; ++i) {
matrix[i] = new int[vertex];
}
for(int i = 0; i < vertex; i++) {
for(int j = 0; j < vertex; j++) {
if(i <= j) {
matrix[i][j] = 0;
}
else{
int generator= (rand () % 100);
matrix[i][j]=( generator < percent ) ? 1:0;
}
}
}
return matrix;
}
// wypisanie
void print(int ** tablica, int rows){
for(int i = 0; i < rows; i++){
for(int j = 0; j < rows; j++)
{
printf("%d ", tablica[i][j]);
}
printf("\n");
}
}
void TopologicGraph::TopologicSort(){
stack<int> stak;
bool visited[vertex];
for (int i = 0; i < vertex; i++)
visited[i] = false;
// wywolujemy sortowanie
for (int i = 0; i < vertex; i++)
if (visited[i] == false)
this->DFSutiling(i, visited, stak);
//wypisz wyniki sortowania
while (stak.empty() == false){
cout << stak.top() << " ";
stak.pop();
}
}
void TopologicGraph::DFSutiling(int vtx, bool visited[], stack<int>&stak){
// ustawiamy na true
visited[vtx]=true;
list<int>::iterator j;
for(j=this->neighbourList[vtx].begin(); j!=this->neighbourList[vtx].end();j++)
if(!visited[*j] )
DFSutiling(*j,visited, stak);
stak.push(vtx); // dodajemy rezultat na stos
}
TopologicGraph::TopologicGraph(int **tab, int vert){
this->vertex= vert;
this->neighbourList= new list<int>[vert];
for(int i = 0; i < vert; i++)
for(int j = 0; j < vert; j++)
if(tab[i][j] == 1){
// cout<<"Zliczaj "<<i<<" ";
this->neighbourList[i].push_back(j);
}
// cout<<"\nkoniec\n";
}
int main (void){
srand (time (NULL));
int** table= generateDAG(5,10);
TopologicGraph g(table, 5);
print(table,5);
cout<<endl;
g.TopologicSort();
return 0;
}
Dalej implementacje mam funkcji- problem jest taki, że za kazdym razem wypisywane są " iteracje, - przejscia przez wierzchołki " do struktury STOSU. Przez co podejrzewam program nie działa poprawnie i/lub cos jest nie tak z listą sąsiedztwa.
Sam algorytm topologiczny jest z http://www.geeksforgeeks.org/topological-sorting/ więc wydaje mi się poprawny.
Na rzeczy musi być coś z przekształcaniem np macierzy na liste, ew z odnoszeniem się do danych
Z góry dzieki za pomoc