这里的有向图我们用邻接表存储
深度优先遍历我们用的是递归思想,这里我们设一个数组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];
}