Algorithm 由路径创建的闭合区域数

Algorithm 由路径创建的闭合区域数,algorithm,graph,coordinates,graph-algorithm,minimization,Algorithm,Graph,Coordinates,Graph Algorithm,Minimization,给定xy平面中由边连接的位置列表描述的路径p,计算必须从p中移除的最少边数,以使p不会关闭xy平面中的任何区域(即,应该可以从任何点到任何其他点)。每个位置都有整数坐标,每个位置都比前一个位置左、右、上或下各有一个单位 例如,如果p={[0,0],[0,1],[1,1],[1,0],[0,0]},则路径是一个以(0,0)为起点和终点的正方形。正方形的4条边中的任何一条都可以删除,因此答案是1 请注意,同一条边可以绘制两次。也就是说,如果P={[0,0],[0,1],[1,1],[1,0],[0,

给定xy平面中由边连接的位置列表描述的路径p,计算必须从p中移除的最少边数,以使p不会关闭xy平面中的任何区域(即,应该可以从任何点到任何其他点)。每个位置都有整数坐标,每个位置都比前一个位置左、右、上或下各有一个单位

例如,如果
p={[0,0],[0,1],[1,1],[1,0],[0,0]}
,则路径是一个以(0,0)为起点和终点的正方形。正方形的4条边中的任何一条都可以删除,因此答案是1

请注意,同一条边可以绘制两次。也就是说,如果P={[0,0],[0,1],[1,1],[1,0],[0,0],[0,1],[1,1],[1,0],[0,0]},答案将是2,因为现在正方形的每一侧都有2条边,因此必须删除至少2条边才能“释放”正方形

我尝试过一种天真的方法,如果任何位置被访问两次,可能会有一个封闭的区域(不总是,但我的程序依赖于这个假设),所以我在移除的最小边数上加1。通常,如果一个顶点被访问N次,我会将N-1添加到移除的边数中。但是,如果,例如,
P={[0,0],[0,1],[0,0]}
,则不存在封闭区域,而我的程序会认为存在封闭区域。另一种故障情况是:如果
P={[0,0],[0,1],[1,1],[1,0],[0,0],[1,0]}
,我的程序将输出2(因为(0,0)和(0,1)分别访问了两次),而正确的答案是1,因为我们可以删除正方形的其他三条边

似乎有两个主要的子任务来解决这个问题:首先,给定路径,找出哪些位置是封闭的(即,找出路径将图形分割成的区域);第二,利用区域知识确定必须删除哪些边以防止封闭

任何提示、伪代码或代码都将不胜感激


来源:普林斯顿大学的算法高级本科生课程。

以下是一些可能有用的想法。我假设你有
n个

您可以先将所有边插入集合
S
,以便删除重复的边:

for(int i = 0; i < n-1; i++)
    S.insert( {min(p[i], p[i+1), max(p[i], p[i+1])} );
for(int i=0;i
现在再次迭代边并构建一个图。然后在此图中找到最长的简单路径


生成的图形是二部图(如果存在循环,它必须具有偶数长度)。这段信息也可能有帮助。

以下是一些可能有帮助的想法。我假设您有
n个

您可以先将所有边插入集合
S
,以便删除重复的边:

for(int i = 0; i < n-1; i++)
    S.insert( {min(p[i], p[i+1), max(p[i], p[i+1])} );
for(int i=0;i
现在再次迭代边并构建一个图。然后在此图中找到最长的简单路径


结果图是二部图(如果存在循环,则其长度必须为偶数)。这段信息可能也会有所帮助。

您可以使用泛洪填充算法来查找路径创建的平面的连续区域。其中一个区域是无限的,但使用扫描线扫描很容易计算周长,这将限制总大小不劣于路径长度的平方。如果路径长度小于1000,则可以接受二次扫描。(编辑:我后来意识到,由于只需要识别与直线边缘相邻的区域,因此可以通过对线段进行排序,然后应用扫描线扫描来进行此计算,从而产生O(n log n)时间复杂度。)

路径中的每条边都位于两个区域之间(或者不相关,因为两侧的正方形都是相同的区域)。对于相关边,您可以计算重复次数,然后找到任何一对相邻区域之间的最小成本边界。一旦您确定了每个正方形的区域id,所有这些都是线性的

现在你有了一个加权图。构造一个最小生成树。这应该是需要删除的边的最小集合

也许有一个更聪明的解决办法。洪水泛滥给我的印象是野蛮和天真,但这是我在十分钟内所能做的最好的


祝您好运。

您可以使用泛洪填充算法来查找路径创建的平面的连续区域。其中一个区域是无限的,但使用扫描线扫描可以轻松计算周长,这将限制总大小不低于路径长度的平方。如果路径长度小于1000次en二次扫描是可以接受的。(编辑:我后来意识到,由于只需要识别与直线边缘相邻的区域,因此可以通过对线段进行排序,然后应用扫描线扫描来进行此计算,从而产生O(n log n)时间复杂度。)

路径中的每条边都位于两个区域之间(或者不相关,因为两侧的正方形都是相同的区域)。对于相关边,您可以计算重复次数,然后找到任何一对相邻区域之间的最小成本边界。一旦您确定了每个正方形的区域id,所有这些都是线性的

现在你有了一个加权图。构造一个最小生成树。这应该是需要删除的边的最小集合

也许有一个更聪明的解决办法。洪水泛滥给我的印象是野蛮和天真,但这是我在十分钟内所能做的最好的


祝你好运。

最大点数是多少?@saadtaame路径最多包含1000个条目。因此,1000条边(具有多重性)。添加更多细节可能会有所帮助。坐标是整数吗?你在哪里遇到这个问题的?狂妄的预感,没有你