Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 图的边遍历算法,有些边是必需的,有些是可选的_Algorithm_Graph_Language Agnostic_Traversal - Fatal编程技术网

Algorithm 图的边遍历算法,有些边是必需的,有些是可选的

Algorithm 图的边遍历算法,有些边是必需的,有些是可选的,algorithm,graph,language-agnostic,traversal,Algorithm,Graph,Language Agnostic,Traversal,我有一个所有顶点都是偶数的无向图。在这个图中,有一组边必须被完全覆盖一次,还有一组边除非绝对必要,否则根本不应该被覆盖。我需要在图中找到一组一条或多条路径,这样所有需要的边都只覆盖一次,并且遍历的不需要的边的数量最小化。没有需要的边可以被多条路径遍历,但是不需要的边可以被任意数量的路径遍历。这不是一条欧拉路径,因为存在可选边 尽管路径可以覆盖任意数量的不需要的边,但每个路径的长度都受到其可以覆盖的所需边的最大数量的限制 起点和终点不必相同,但有一组可能的起点 某些不需要的边与所需边重合-也就是说

我有一个所有顶点都是偶数的无向图。在这个图中,有一组边必须被完全覆盖一次,还有一组边除非绝对必要,否则根本不应该被覆盖。我需要在图中找到一组一条或多条路径,这样所有需要的边都只覆盖一次,并且遍历的不需要的边的数量最小化。没有需要的边可以被多条路径遍历,但是不需要的边可以被任意数量的路径遍历。这不是一条欧拉路径,因为存在可选边

尽管路径可以覆盖任意数量的不需要的边,但每个路径的长度都受到其可以覆盖的所需边的最大数量的限制

起点和终点不必相同,但有一组可能的起点

某些不需要的边与所需边重合-也就是说,一对顶点之间可能同时具有所需边和不需要的边,尽管给定的一对顶点之间每种类型的边不会超过一条


什么是一个好的算法开始?从根本上说,我正在寻找一种算法,可以找到一条路径,该路径只遍历所需的边一次,并在可能时避免不需要的边,但在必要时可以多次遍历它们。我可以在此基础上做其余的事情。

我认为这可以归结为旅行推销员的问题。创建一个变换图,其中节点表示强制边,边权重表示从一条强制边到另一条强制边必须遍历的可选边数

现在的问题是在经过所有节点和边的变换图中找到最短路径。这就是TSP,它是NP难的

这会有一些复杂的情况,因为强制边之后可以选择的路径取决于选择的方向。可以通过将每个强制边转化为两个节点(每个方向一个节点)来解决此问题。然后,TSP必须访问每对中的一个节点

e、 g

转换图: 节点={AB,BA,BC,CB}
Edge={AB->BC成本0,BA->CB成本1,CB->BA成本0,BC->AB成本1}

我认为这可以归结为旅行商问题。创建一个变换图,其中节点表示强制边,边权重表示从一条强制边到另一条强制边必须遍历的可选边数

现在的问题是在经过所有节点和边的变换图中找到最短路径。这就是TSP,它是NP难的

这会有一些复杂的情况,因为强制边之后可以选择的路径取决于选择的方向。可以通过将每个强制边转化为两个节点(每个方向一个节点)来解决此问题。然后,TSP必须访问每对中的一个节点

e、 g

转换图: 节点={AB,BA,BC,CB}
边={AB->BC-cost 0,BA->CB-cost 1,CB->BA-cost 0,BC->AB-cost 1}

您正在原始图中查找一个子图,使其包含所有需要的边,并使不需要的边最少,从而包含欧拉路径

已知图包含欧拉路径的充要条件是它是连通的,并且除了偶数次的2个顶点外,它的所有顶点都是连通的。这可以通过执行以下操作来确保:

首先直接在最终子图中包含所有所需的边。现在有了一个包含一个或多个连接组件的图形。 案例1:

如果此子图中的组件数为1,即所有边都相互连接,则只需确保除2之外的所有顶点都具有偶数阶。由于原始图形的所有顶点都是偶数,因此可以这样做,但我们还需要注意,为达到此目的而添加的边数是最小的,因为只剩下不需要的边来添加

一种很好的启发式方法是,从每个奇数阶顶点开始,进行BFS宽度优先搜索,直到到达另一个奇数阶顶点。对所有奇数阶顶点执行此操作,选择在它们之间采用最大非期望路径的两个顶点以实现此操作,然后删除此路径。现在,图形将具有欧拉路径

需要注意的一点是,这种奇数顶点的配对总是可能的,因为没有一个图可以有奇数个奇数度的顶点

案例2:

仅由所需边组成的子图具有多个分量。要确保连接性,请执行以下操作-以顶点数最少的组件为例。从每个顶点执行BFS,并选择将此组件连接到任何其他组件的最小长度路径 t

重复此过程,直到所有组件合并为单个组件。现在,对于均匀性,请遵循前面针对案例1概述的步骤


您正在原始图中查找一个子图,使其包含所有需要的边,并使不需要的边最少,使其包含欧拉路径

已知图包含欧拉路径的充要条件是它是连通的,并且除了偶数次的2个顶点外,它的所有顶点都是连通的。这可以通过执行以下操作来确保:

首先直接在最终子图中包含所有所需的边。现在有了一个包含一个或多个连接组件的图形。 案例1:

如果此子图中的组件数为1,即所有边都相互连接,则只需确保除2之外的所有顶点都具有偶数阶。由于原始图形的所有顶点都是偶数,因此可以这样做,但我们还需要注意,为达到此目的而添加的边数是最小的,因为只剩下不需要的边来添加

一种很好的启发式方法是,从每个奇数阶顶点开始,进行BFS宽度优先搜索,直到到达另一个奇数阶顶点。对所有奇数阶顶点执行此操作,选择在它们之间采用最大非期望路径的两个顶点以实现此操作,然后删除此路径。现在,图形将具有欧拉路径

需要注意的一点是,这种奇数顶点的配对总是可能的,因为没有一个图可以有奇数个奇数度的顶点

案例2:

仅由所需边组成的子图具有多个分量。要确保连接性,请执行以下操作-以顶点数最少的组件为例。从每个顶点执行BFS,并选择将此组件连接到任何其他组件的最小长度路径

重复此过程,直到所有组件合并为单个组件。现在,对于均匀性,请遵循前面针对案例1概述的步骤


这是NP难的:哈密顿路径问题的一个实例可以转化为你的问题的一个实例。因此,如果你知道如何解决你的问题,你就知道如何解决哈密顿路径问题

要进行变换,请使用一个有向图并将每个顶点加倍,例如,转换为红色和蓝色顶点。对于每个前一个顶点,使所有入站边变为红色顶点,所有出站边变为蓝色顶点。从红色顶点到蓝色顶点创建一条新边。显然,如果你能解决这个图的哈密顿圈问题,你也能解决原始图的哈密顿圈问题


现在,将所有新边标记为强制,将所有旧边标记为可选。将单个红色顶点标记为可能的入口点。如果你的问题有一个解决方案,那么它由一条路径组成,这是原始图的哈密顿路径。

这是NP难的:哈密顿路径问题的一个实例可以转化为你的问题的一个实例。因此,如果你知道如何解决你的问题,你就知道如何解决哈密顿路径问题

要进行变换,请使用一个有向图并将每个顶点加倍,例如,转换为红色和蓝色顶点。对于每个前一个顶点,使所有入站边变为红色顶点,所有出站边变为蓝色顶点。从红色顶点到蓝色顶点创建一条新边。显然,如果你能解决这个图的哈密顿圈问题,你也能解决原始图的哈密顿圈问题


现在,将所有新边标记为强制,将所有旧边标记为可选。将单个红色顶点标记为可能的入口点。如果您的问题有解决方案,那么它由一条路径组成,该路径是原始图形的哈密顿路径。

阅读Cormen,Leiserson,Rivest-算法简介,了解图形算法的详细介绍。感谢推荐;我在当地的一家书店找到了一本。阅读Cormen,Leiserson,Rivest-算法简介,了解图形算法的详细介绍。谢谢你的推荐;我在当地一家书店找到了一本。谢谢。我在原来的问题中漏掉了一点;某些不需要的边与所需边重合-即,一对顶点之间可能同时具有所需边和不需要的边。我仍然需要一些时间来考虑你的答案,但我想知道这是否会影响什么。我忽略它的原因是因为我在概括这个问题,但现在我不确定我是否错误地概括了它,或者它是否仍然是同一个问题。你是说一条边既可以是必需的,也可以是不需要的?或者一对端点之间可以有两条边-一条是必需的,另一条是不需要的?如果是第一种情况,这并不重要,因为即使该边是不需要的,也必须将其包含在子图中,因为它是必需的。即使是第二种情况,也不会造成任何问题,因为您只需使用所需的e
dge。就实现图形连接性而言,可以忽略不需要的边,并且在尝试实现均匀性条件时,可以根据需要将其包括在内。谢谢。我在原来的问题中漏掉了一点;某些不需要的边与所需边重合-即,一对顶点之间可能同时具有所需边和不需要的边。我仍然需要一些时间来考虑你的答案,但我想知道这是否会影响什么。我忽略它的原因是因为我在概括这个问题,但现在我不确定我是否错误地概括了它,或者它是否仍然是同一个问题。你是说一条边既可以是必需的,也可以是不需要的?或者一对端点之间可以有两条边-一条是必需的,另一条是不需要的?如果是第一种情况,这并不重要,因为即使该边是不需要的,也必须将其包含在子图中,因为它是必需的。即使是第二种情况,也不会造成任何问题,因为您只获取所需的边。就实现图形连通性而言,可以忽略不需要的边,并且在尝试实现均匀性条件时,可以根据需要包括不需要的边。
A===C
|  /
| /             (edges A<->B and B<->C are compulsory, A<=>C is optional)
|/
B