Algorithm 任意点网格的拓扑排序?

Algorithm 任意点网格的拓扑排序?,algorithm,graph,grid,topological-sort,Algorithm,Graph,Grid,Topological Sort,我有一个由点x,y组成的网格,你可以从一个点移动到一个直接可见的点,只要新的点有一个更大的x,y,或者两者都有。我将如何对其进行拓扑排序?此网格有大量拓扑排序。但是,其中一些非常容易计算,没有任何空间开销: 从下到上、从左到右遍历行 从左到右、从下到上遍历列 列出x和y之和为零的所有点,然后列出x和y之和为1的所有点,以此类推 希望这有帮助 因为这是一种传递关系(即,如果你可以从a到b,b到c,那么你必须能够从a到c),你可以简单地对你的点进行排序以实现拓扑排序 例如,此C代码将根据第一个坐标对

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

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

  • 从下到上、从左到右遍历行
  • 从左到右、从下到上遍历列
  • 列出x和y之和为零的所有点,然后列出x和y之和为1的所有点,以此类推

  • 希望这有帮助

    因为这是一种传递关系(即,如果你可以从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)(100100),这些点已根据第一个坐标进行排序,因此这将是qsort调用的输出


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

    为什么你不能采用算法,并根据你的具体情况进行调整?试着理解如何调整它。我所拥有的只是点x的数组,yOk,是哪一部分导致了问题?确定连接点,它的正确数据结构,在我的情况下最终结果应该是什么样的?如果我有点(0,0)(1,99)(9,16)(16,9)(36,64)(64,36)(100100)?@AgainstASicilian-哦,我的道歉-我误解了你的问题。我认为你有一个矩形的所有点的nxm网格,而不是你需要考虑的所有要点的明确列表。我建议更新你的问题,让它更清楚,“点网格”通常意味着一个完整的矩形。如果我必须在从a到c的过程中通过b,那么我不能说我可以直接从a到c。你是对的。我误解了这个问题,认为x和y都必须大于或等于。但是,如果这不是正确的读数,则不可能进行拓扑排序,因为可以从(9,16)到(16,9)(大x)和(16,9)到(9,16)(大y),因此图形包含循环。