按顺时针顺序对图形邻接列表中的顶点进行排序

时间:2014-05-16 13:18:33

标签: c++ sorting graph adjacency-list

我有一个平面图表示为圆形链表的数组。 每个列表代表一个顶点及其相邻顶点。

我需要按顺时针平面顺序对每个邻接列表中的顶点进行排序。

我对如何做到这一点没有任何想法。有算法吗?

1 个答案:

答案 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)