【算法设计题】判断无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径,第8题(C/C++)

 

目录

第8题 判断无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径

得分点(必背)

函数定义

递归基准条件

递归条件

遍历邻接点

恢复标记

函数返回

总结


🌈 嗨,我是命运之光

🌌 2024,每日百字,记录时光,感谢有你,携手前行~

🚀 携手启航,我们一同深入未知的领域,挖掘潜能,让每一步成长都充满意义。


第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 是否未被访问且从 tempj 是否存在一条长度为 k-1 的路径。如果存在这样的路径,则返回1。

恢复标记

visited[i] = 0;
  • 解释:在所有邻接点的递归调用结束后,将当前顶点 i 的访问标记恢复为0。这样可以确保其他路径的探索不受影响。每次递归结束后,都需要将顶点标记恢复,以便其他路径的搜索可以重新访问该顶点。

函数返回

return 0;
  • 解释:如果所有邻接点都没有找到符合条件的路径,则返回0,表示没有找到长度为 k 的简单路径。

总结

  1. 递归基准条件:当当前顶点是目标顶点且路径长度为0时,返回1。
  2. 递归条件:当路径长度大于0时,遍历所有邻接点,尝试找到从当前邻接点到目标顶点的路径,路径长度减1。
  3. 恢复标记:确保每次递归结束后,恢复顶点访问标记,保证路径的简单性。
  4. 返回值:如果找到符合条件的路径,则返回1;否则,返回0。

通过这种方式,函数递归地探索图中的路径,并确保路径是简单路径,最终判断是否存在一条符合长度要求的路径。


嗨,我是命运之光。如果你觉得我的分享有价值,不妨通过以下方式表达你的支持:👍 点赞来表达你的喜爱,📁 关注以获取我的最新消息,💬 评论与我交流你的见解。我会继续努力,为你带来更多精彩和实用的内容。

点击这里👉 ,获取最新动态,⚡️ 让信息传递更加迅速。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

命运之光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值