我有一组坐标点x,y,从一个点可以到达一个立即可见的点,只要新点的x或y大于当前点。那么如何对此进行拓扑排序?
我有一组坐标点x,y,从一个点可以到达一个立即可见的点,只要新点的x或y大于当前点。那么如何对此进行拓扑排序?
这个网格有大量的拓扑排序方式。然而,其中一些排序方式非常容易计算且不需要额外的空间开销:
希望这能帮到你!
因为这是一种传递关系(即如果您可以从a到b,b到c,那么您必须能够从a到c),所以您可以简单地对点进行排序以实现拓扑排序。
例如,此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(并且再次出现在排序列表中较早的位置)。