数据结构拓展习题:图判断顶点间是否存在简单路径并打印
题目:已知邻接表表示的有向图,请编程判断从第u顶点至第v顶点是否有简单路径,若有则打印出该路径上的顶点。




bool visited[MAX_VERTEX_NUM];
bool Reachable(ALGraph G, int u, int v)
{
int flag = 0;
Sqstack S, T;
InitStack(S);
InitStack(T);
int parent[MAX_VERTEX_NUM] = { 0 };
for (int i = 0; i < G.vexnum; i++)
{
visited[i] = false;
}
Push(S, u);//将开始顶点入栈
visited[u] = true;//将开始顶点设为已访问
int e, i;
ArcNode* p;
while (!StackEmpty(S))
{
e = Pop(S);
p = G.vertices[e].firstarc;
while (p)
{
if (p->adjvex == v)//如果找到了目标顶点v
{
flag = 1;//标记为已找到
parent[p->adjvex] == e;//v的前驱结点为e
printf("Path: ");
i = v;//将栈中的元素颠倒过来倒序输出路径
while (i != u)
{
Push(T, i);
i = parent[i];
}
Push(T, u);
while (!StackEmpty(T))
{
printf("%d ", G.vertices[Pop(T)].data);
}
}
else if (visited[p->adjvex] == false)//如果未找到且邻接点未访问过
{
visited[p->adjvex] = true;//继续搜索
parent[p->adjvex] = e;
Push(S, p->adjvex);
}
p = p->nextarc;
}
}
if (flag)
return true;
return false;
}