【发布时间】:2017-10-17 14:55:40
【问题描述】:
我正在尝试实现一个函数pathExists,它以图形 ADT 'g' 作为输入,以及两个顶点 a 和 b。如果两个顶点之间存在路径,则该函数返回 1,否则返回 0。我不确定如何执行此操作。我在下面实现了深度优先搜索(DFS)算法,它将生成int *visited,一个包含访问节点顺序的数组。我只是想知道如何使用这个算法来实际编写pathExists 函数。谢谢!
编辑:尝试-
void dfsR(Graph g, int v);
int *visited; // array of visited
int order;
int PathExists(Graph g, int src, int dest)
{
int i;
order = 1;
visited = malloc(sizeof(int)*g->nV);
for(i=0; i<g->nV; i++){
visited[i] = -1;
}
dfsR(g, src);
int connected = 0;
if(visited[dest]!=-1){
connected = 1;
}
return connected;
}
void dfsR(Graph g, int v){
visited[v] = order++;
int w;
for(w=0; w<g->nV; w++){
if(!hasEdge(g, v,w)){
continue;
}
if(!visited[w]){
dfsR(g, w);
}
}
}
【问题讨论】:
-
假设您从两个节点之一开始执行深度优先搜索。当且仅当且仅在该搜索期间访问了另一个时,它们之间存在一条路径。
-
@JohnBollinger 你从哪个节点开始有关系吗?一个必须小于另一个吗?
-
因为这是目前写的,我想你不能说。您将
visited[v]设置为DFS 访问顶点v的顺序,但您仅malloc该数组,您从不初始化它的值。它包含任意数据并且很可能包含序列1, 2, ..., nV(g),这可能使它看起来好像一个完全未连接的图是完全连接的。如果visited[k] <= nV(g),则无法知道它是由 DFS 设置的,还是在分配时恰好具有该值。 -
@Patrick87 那么应该将所有内容初始化为什么? -1 也许?
-
@novice 可以。 0 也应该工作。基本上,只要保证不在
1, 2, ..., nV(g)范围内,任何事情都会起作用。
标签: c algorithm graph-theory graph-traversal