第8题 判断无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径
编写算法,判断无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径(简单路径指的是其顶点序列中不含有重复出现的顶点)。
//判断是否存在长度为 k 的简单路径
int visited[MAXSIZE];
int exist_path_len(ALGraph G ,int i, int j,int k){
if(i==j&&k==0){
return 1;
}
else if(k>0){
visited[i]=1;
for(ArcNode* p=G.vertices[i].firstarc;p;p=p->nextarc){
int temp=p->adjvex;
if(!visited[temp]&&exist_path_len(G,temp,j,k-1)){
return 1;
}
visited[i]=0;
}
return 0;
}
}
下面是对 exist_path_len
函数的逐步详细解释:
int visited[MAXSIZE]; int exist_path_len(ALGraph G, int i, int j, int k) {
visited[MAXSIZE]
: 一个全局数组,用于标记图中顶点是否已经被访问过。exist_path_len(ALGraph G, int i, int j, int k)
: 判断在无向图 G
中,是否存在一条从顶点 i
到顶点 j
长度为 k
的简单路径。简单路径指的是路径中不重复顶点。if (i == j && k == 0) { return 1; }
i
与目标顶点 j
相同,且路径长度 k
为0。i
就是目标顶点 j
,并且路径长度 k
达到0,说明找到了长度为0的路径,即符合要求的路径。返回1表示找到了一条符合条件的路径。else if (k > 0) { visited[i] = 1;
k
大于0。i
标记为已访问 (visited[i] = 1
),防止在路径中重复访问此顶点。for (ArcNode* p = G.vertices[i].firstarc; p; p = p->nextarc) {
int temp = p->adjvex;
if (!visited[temp] && exist_path_len(G, temp, j, k - 1)) {
return 1;
}
visited[i] = 0;
}
for (ArcNode* p = G.vertices[i].firstarc; p; p = p->nextarc)
遍历顶点 i
的所有邻接点。 p
是当前弧的指针,p->adjvex
是邻接点的编号。int temp = p->adjvex
取得当前邻接点的编号。if (!visited[temp] && exist_path_len(G, temp, j, k - 1))
检查邻接点 temp
是否未被访问且从 temp
到 j
是否存在一条长度为 k-1
的路径。如果存在这样的路径,则返回1。visited[i] = 0;
i
的访问标记恢复为0。这样可以确保其他路径的探索不受影响。每次递归结束后,都需要将顶点标记恢复,以便其他路径的搜索可以重新访问该顶点。return 0;
k
的简单路径。通过这种方式,函数递归地探索图中的路径,并确保路径是简单路径,最终判断是否存在一条符合长度要求的路径。