[vtkusers] vtkBoostPrimMinimumSpanningTree unexpected result: MST is a forest
David Doria
daviddoria+vtk at gmail.com
Fri Oct 30 13:57:40 EDT 2009
I am trying to find the minimum spanning tree of a graph:
vtkSmartPointer<vtkBoostPrimMinimumSpanningTree>
MinimumSpanningTreeFilter =
vtkSmartPointer<vtkBoostPrimMinimumSpanningTree>::New();
MinimumSpanningTreeFilter->SetOriginVertex(MaxZId);
MinimumSpanningTreeFilter->SetInput(NearestNeighborGraph);
MinimumSpanningTreeFilter->SetEdgeWeightArrayName("Weights");
But I am getting this error:
vtkBoostPrimMinimumSpanningTree (0x85dda08): Unexpected result: MST is
a forest (collection of trees).
I was assuming the graph was disconnected, so I wrote this function to
connected the disconnected parts of the graph, and call it with:
ConnectGraph(NearestNeighborGraph, input->GetPoints());
void ConnectGraph(vtkMutableUndirectedGraph* G, vtkPoints* Points)
{
//the graph already contains a vertex for every point in Points - we
need Points only to build the KDTree
vtkSmartPointer<vtkKdTree> KDTree = vtkSmartPointer<vtkKdTree>::New();
KDTree->BuildLocatorFromPoints(Points);
std::queue <unsigned int> q;
for(unsigned int i = 0; i < G->GetNumberOfVertices(); i++)
{
q.push(i);
}
while (!q.empty())
{
unsigned int id = q.front();
q.pop();
unsigned int degree = G->GetInDegree(id);
if(degree == 0)
{
//add an edge from the current point (degree==0) to the closest
point in the graph
double p[3];
Points->GetPoint(id, p);
double dist;
unsigned int ClosestPointId = KDTree->FindClosestPoint(p, dist);
G->AddEdge(id, ClosestPointId);
}
}
}
However, it never passes the "degree == 0" test, so I'm assuming the
graph is connected. If that is the case, why would I get this "MST is
a forest" error? Or have I done something wrong with checking if the
graph is connected (every vertex must be of degree at least 1)?
Thanks,
David
More information about the vtkusers
mailing list