深度优先遍历和广度优先遍历判断有向图中是否有s到t的路径

这里的有向图我们用邻接表存储
深度优先遍历我们用的是递归思想,这里我们设一个数组visited表示节点是否被访问,以s为起点,访问链表s的第一个未被访问的节点,然后再对这个节点做深度优先遍历,递归结束后,如果visited[t]==1,那么就有s到t的路径。

#define MAXSIZE 100
int visited[MAXSIZE];
void DFS(Graph p,int s,int t)
{
if(visited[t]==1)return;//如果t访问了循环结束,节省时间
visited[s]=1;
printf("%d",s);
ArcNode *q;
int w;
for(q=p.vertices[s].firsttarc;q!=NULL;q=q->nextarc)
{
w=q->adjvex;
if(!visited[w])
DFS(p,w,t)
}
}
int DFSTraverse(Graph p,int vexnum,int s,int t)
{
int i;
for(i=0;i<vexnum;i++)//先把数组元素置0表示没访问
visited[i]=0;
DFS(p,s,t)
return visited[t];
}

广度优先遍历同样用到visited数组,再设一个队列a,将起点s放入队列,当队列指针f!=r时,把队首输出,再将队首在有向图中未被访问的节点放入队列中

void DFS(ALGraph p,int s,int t)
{
 visited[s]=1;
 int a[MAXSIZE];
 int f=0,r=0,w;
 a[r++]=s;
 ArcNode *temp;
 while(f!=r)
 {
  w=a[f++];printf("%d",w);
  for(temp=p.vertices[w].firsttarc;temp!=NULL;temp=temp->nextarc)
  {
   if(!visited[temp->adjvex])
   { visited[temp->adjvex]=1;
   a[r++]=temp->adjvex;
   }
  }
 }
}
int DFSTraverse(ALGraph p,int vexnum,int s,int t)
{
 int i;
 for(i=0;i<vexnum;i++)
  visited[i]=0;
 DFS(p,s,t);
 return visited[t];
}
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值