Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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
Graph 为图形算法编写伪代码_Graph_Graph Algorithm_Depth First Search - Fatal编程技术网

Graph 为图形算法编写伪代码

Graph 为图形算法编写伪代码,graph,graph-algorithm,depth-first-search,Graph,Graph Algorithm,Depth First Search,给定一个DAG和一个函数,它将每个顶点映射到一个从1到的唯一数字,我需要为一个算法编写一个伪代码,该算法在从v可以到达的所有顶点u中为每个顶点找到最小值,并将其保存为一个v属性。算法的时间复杂度需要为(假设时间复杂度为) 我考虑过使用DFS(或其变体)和/或拓扑排序,但我不知道如何使用它来解决这个问题 此外,我需要考虑一种算法,它可以得到一个无向图和函数,并为每个顶点计算相同的东西,我也不知道如何做。您使用DFS的想法是正确的。实际上,函数f(v)仅用于说明每个节点可以从1到|v之间的数字中唯一

给定一个DAG和一个函数,它将每个顶点映射到一个从1到的唯一数字,我需要为一个算法编写一个伪代码,该算法在从v可以到达的所有顶点u中为每个顶点找到最小值,并将其保存为一个v属性。算法的时间复杂度需要为(假设时间复杂度为)

我考虑过使用DFS(或其变体)和/或拓扑排序,但我不知道如何使用它来解决这个问题


此外,我需要考虑一种算法,它可以得到一个无向图和函数,并为每个顶点计算相同的东西,我也不知道如何做。

您使用DFS的想法是正确的。实际上,函数
f(v)
仅用于说明每个节点可以从1到
|v
之间的数字中唯一标识

作为解决问题的提示,您必须修改DFS,以便它返回可从此节点访问的顶点
v
f(v)
的最小值,并将其保存到另一个数组中,例如
minReach
,并且索引将由函数
f(v)
给出。访问的数组
vis
将使用
f(v)
进行类似的识别

我也给伪代码,如果你不能解决,但在你自己的第一次尝试。 伪代码类似于python,假设图形和函数
f(v)
可用。并假设了基于0的索引

vis=[0, 0, 0, .. |V| times]  # visited array for dfs 
minReach= [1, 2, 3, .. |V| times] #  array for storing no. reachable nodes from a node

function dfs(node):
   vis[f(node)-1]=1                             ### mark unvisited node as visited 
   for v in graph[node]:
       if vis[v]!=1:                            ## check whether adjacent node is visited
           minReach[f(node)-1]=min(minReach[f(node)-1],dfs(v)        ## if not visited apply dfs again
       else:
           minReach[f(node)-1]=min(minReach[f(node)-1],countReach[f(v)-1])   ## else store the minimum node that can be reached from this node.
   return countReach[f(node)-1]

for vertex in graph:         ### each vertex is checked in graph
   if vis[f(vertex)-1]!=1:   ### if vertex is not visited dfs is applied
      dfs(vertex)  

您使用DFS的想法是正确的。实际上,函数
f(v)
仅用于说明每个节点可以从1到
|v
之间的数字中唯一标识

作为解决问题的提示,您必须修改DFS,以便它返回可从此节点访问的顶点
v
f(v)
的最小值,并将其保存到另一个数组中,例如
minReach
,并且索引将由函数
f(v)
给出。访问的数组
vis
将使用
f(v)
进行类似的识别

我也给伪代码,如果你不能解决,但在你自己的第一次尝试。 伪代码类似于python,假设图形和函数
f(v)
可用。并假设了基于0的索引

vis=[0, 0, 0, .. |V| times]  # visited array for dfs 
minReach= [1, 2, 3, .. |V| times] #  array for storing no. reachable nodes from a node

function dfs(node):
   vis[f(node)-1]=1                             ### mark unvisited node as visited 
   for v in graph[node]:
       if vis[v]!=1:                            ## check whether adjacent node is visited
           minReach[f(node)-1]=min(minReach[f(node)-1],dfs(v)        ## if not visited apply dfs again
       else:
           minReach[f(node)-1]=min(minReach[f(node)-1],countReach[f(v)-1])   ## else store the minimum node that can be reached from this node.
   return countReach[f(node)-1]

for vertex in graph:         ### each vertex is checked in graph
   if vis[f(vertex)-1]!=1:   ### if vertex is not visited dfs is applied
      dfs(vertex)  

谢谢,但是该算法需要在从v可以到达的所有顶点u中找到f(u)的最小值,并且不计算有多少个顶点可以到达。如何将其扩展到循环有向图(而不是DAG)?我认为这在循环有向图的情况下也应该起作用。因为对于循环图,我们访问一个已经访问过的节点时会有一个后缘。这种情况是当处理的邻居的
vis[v]=1
时。如果您发现了一个可能无法访问的示例,请进行评论。如果您感到满意,请接受答案谢谢,但该算法需要在所有可从v访问的顶点u中找到f(u)的最小值,并且不计算可访问的顶点数。如何将其扩展为循环有向图(不是DAG)?我认为这在循环有向图的情况下也应该有效。因为对于循环图,我们访问一个已经访问过的节点时会有一个后缘。这种情况是当处理的邻居的
vis[v]=1
时。如果您发现了一个可能不适用的示例,请进行评论。如果您满意,请接受答案