任意点网格的拓扑排序?

时间:2013-01-20 19:38:03

标签: algorithm graph grid topological-sort

我有一个点x,y的网格,只要新点有更大的x,y或两者,你就可以从一个点移动到一个直接可见的点。我如何在拓扑上对此进行排序?

2 个答案:

答案 0 :(得分:2)

这个网格有大量的拓扑排序。但是,其中一些非常容易计算而没有任何空间开销:

  1. 从左到右,从左到右迭代各行。
  2. 从左到右,从下到上迭代列。
  3. 列出x和y之和为零的所有点,然后x和y之和为1,等等。
  4. 希望这有帮助!

答案 1 :(得分:1)

因为这是一个传递关系(即如果你可以从a到b,从b到c,那么你必须能够从a到c)你可以简单地对点进行排序以实现拓扑排序。 / p>

例如,此C代码将通过基于第一个坐标对点进行排序来执行拓扑排序的点数,如果第一个坐标匹配,则执行第二个坐标。

int C[1000][2];

int compar(const void*a,const void*b)
{
  int *a2=(int*)a;
  int *b2=(int*)b;
  int d=a2[0]-b2[0];
  if (d)
    return d;  // Sort on first coordinate
  return a2[1]-b2[1];  // Sort on second coordinate
}

...
qsort(C,1000,sizeof(int)*2,compar);
...

对于您的示例(0,0)(1,99)(9,16)(16,9)(36,64)(64,36)(100,100),这些点已根据第一个坐标排序所以这将是qsort调用的输出。

这种方法有效,因为如果你可以从a到b,那么a必须有一个较小的x(因此在列表中较早出现),或者相同的x和较小的y(并且再次出现在排序的前面)列表)。