我有一个平面图表示为圆形链表的数组。 每个列表代表一个顶点及其相邻顶点。
我需要按顺时针平面顺序对每个邻接列表中的顶点进行排序。
我对如何做到这一点没有任何想法。有算法吗?
答案 0 :(得分:2)
由于您在评论中指出您有平面坐标,因此这是一个使用它们的解决方案(伪代码)。基本上,您按照从顶点到相邻顶点a
的向量的v
的升序对每个顶点atan2
的相邻顶点(a - v)
进行排序。
struct Point
{
x, y;
};
// assume Point has overloaded arithmetic operators
void sortAdjacentVertices(Point v, list<Point> adjacentVertices)
{
map<double, Point> sorted;
for each (a in adjacentVertices)
{
Point dir = a - v;
sorted[atan2(dir.y, dir.x)] = a;
}
adjacentVertices.clear();
for each (a in sorted)
{
adjacentVertices.push(a.value);
}
}
为图的每个顶点调用此函数将在O(V * log(V))中运行,其中V是顶点数,假设可以在O(1)中获得邻接列表。这是因为每个边缘只检查一次(对于有向图)或两次(对于无向图)和number of edges in a planar graph is O(V)。