采用邻接表存储结构,编写一个算法,判别无向图中任意给定的两个顶点之间是否存在一条长度为为k的简单路径


上图是具体的结构 ,要明确vertices是顶点数组,firstarc是第一个指向顶点的指针,nextarc是指向下一个顶点的指针,adjvex是相邻顶点的值,也就是在vertices的索引位置.

int visited[MAXSIZE]; 
int exist_path_len(ALGraph G,int i,int j,int k)
//判断邻接表方式存储的无向图G的顶点i到j是否存在长度为k的简单路径 
{
	if(i==j&&k==0) return true; //找到了一条路径,且长度符合要求 
	 else if(k>0) 
  {
  	visited[i]=1; 
	for(p=G.vertices[i].firstarc;p!=NULL;p=p->nextarc) 
    {
    	m=p->adjvex; 
     	if(!visited[m]) 
      	  if(exist_path_len(G,m,j,k-1)) return true; //剩余路径长度减一 
    }//for 
    visited[i]=0; //本题允许曾经被访问过的结点出现在另一条路径中 
    //这里需要把已经访问的点重新置为0,因为如果当前不存在长度为k
	//到达j点,那么这个点还是可以使用的,因为有可能从其他点出发
	//可以到达j点并且长度为k 
	//可以看下图解释
  }//else 
 return false; //没找到 
}//exist_path_len

在这里插入图片描述
假如寻找无向图中1-4 ,k为3的路径
第一次路径为 1-3-4 ,查找失败,此时visited[3]已经被置为1,若不把visited[3]恢复为0,在递归到1-2-3-4这条路径时,会认为visited[3]已经访问过,从而寻找失败。

  • 48
    点赞
  • 150
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值