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