Jeg har virkelig problemer med at implementere algoritmen korrekt. Det kan nok være svært for jer der gerne vil hjælpe mig lige sådan at få mening ud af de nedenstående koder.
Jeg har en graf med knuder (vertex) og kanter (edge), via Sort kalder jeg Visit der rekursivt finder strongly connected components. Jeg har forsøgt at kommenterer min kode i forhold til eksemplet på wikipedia. Håber det giver mening.
Jeg tror jeg går galt i byen fra det punkt hvor jeg benytter Min() funktionen og så specielt den sidste del af Visit() funktionen. Hvor jeg udskriver SCC (hvilket jeg ikke gør endnu).
Ihvertfald får jeg en fejl i linien:
Vertex* vNext = (Vertex*) unsettled.back();
http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithmHåber meget på lidt hjælp
Mvh
Carsten
void Tarjan::Sort()
{
//get First vertex/node in graph
Vertex* vertex = graph->GetFirst();
// Start a DFS at the start node
Visit(vertex);
}
void Tarjan::Visit(Vertex* v)
{
Vertex* vertex = (Vertex*) v;
// Set the depth index for v
vertex->SetDepth(index);
// Set the lowlink index for v
vertex->SetLowlink(index);
index++;
//unsettled is a vector<Vertex*>
unsettled.push_back(vertex);
// Push v on the stack (kører jeg bagvendt pga. vector)
// Consider successors of v
// Iterate all edges to v
Edge* edge = (Edge*) vertex->GetEdges();
while(edge)
{
// Was successor v' visited?
// int depth of vertices initialized to -1
if(edge->GetEndVertex()->GetDepth() == -1)
{
// Recurse
Visit(edge->GetEndVertex());
//assign smallest int of lowlink this vertex and end vertex
vertex->SetLowlink(Min(vertex->GetLowlink(), edge->GetEndVertex()->GetLowlink()));
}
// Is v' on the stack?
else if(FoundInStack(edge->GetEndVertex()))
{
//assign smallest int of this vertex lowlink and end vertex depth
vertex->SetLowlink(Min(vertex->GetLowlink(), edge->GetEndVertex()->GetDepth()));
}
edge = edge->GetNext();
}
// Is v the root of an SCC?
if(vertex->GetLowlink() == vertex->GetDepth())
{
//repeat untill v' equals v
while(vertex->GetNext() != vertex)
{
Vertex* vNext = (Vertex*) unsettled.back();
unsettled.pop_back();
}
}
}
bool Tarjan::FoundInStack(Vertex* vertex)
{
for(int i = 0; i < unsettled.size(); i++)
{
if(vertex == unsettled.at(i))
return true;
}
return false;
}
int Tarjan::Min(int m1, int m2)
{
int m;
m = (m1 < m2) ? m1 : m2;
return m;
}