數(shù)據(jù)結(jié)構(gòu)拓展習(xí)題:圖判斷頂點(diǎn)間是否存在簡(jiǎn)單路徑并打印
題目:已知鄰接表表示的有向圖,請(qǐng)編程判斷從第u頂點(diǎn)至第v頂點(diǎn)是否有簡(jiǎn)單路徑,若有則打印出該路徑上的頂點(diǎn)。




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);//將開(kāi)始頂點(diǎn)入棧
?????? visited[u] = true;//將開(kāi)始頂點(diǎn)設(shè)為已訪問(wèn)
?????? int e, i;
?????? ArcNode* p;
?????? while (!StackEmpty(S))
?????? {
????????????? e = Pop(S);
????????????? p = G.vertices[e].firstarc;
????????????? while (p)
????????????? {
???????????????????? if (p->adjvex == v)//如果找到了目標(biāo)頂點(diǎn)v
???????????????????? {
??????????????????????????? flag = 1;//標(biāo)記為已找到
??????????????????????????? parent[p->adjvex] == e;//v的前驅(qū)結(jié)點(diǎn)為e
??????????????????????????? printf("Path: ");
??????????????????????????? i = v;//將棧中的元素顛倒過(guò)來(lái)倒序輸出路徑
??????????????????????????? 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)//如果未找到且鄰接點(diǎn)未訪問(wèn)過(guò)
???????????????????? {
??????????????????????????? visited[p->adjvex] = true;//繼續(xù)搜索
??????????????????????????? parent[p->adjvex] = e;
??????????????????????????? Push(S, p->adjvex);
???????????????????? }
???????????????????? p = p->nextarc;
????????????? }
?????? }
?????? if (flag)
????????????? return true;
?????? return false;
}