1. 程式人生 > >C 試基於圖的深度優先搜尋策略寫一演算法 判別以鄰接表方式儲存的有向圖中是否存在由頂點 vi到頂點 vj的路徑 i≠j 。

C 試基於圖的深度優先搜尋策略寫一演算法 判別以鄰接表方式儲存的有向圖中是否存在由頂點 vi到頂點 vj的路徑 i≠j 。

嚴蔚敏 資料結構 7.22

給大佬跪了,這個是要返回的,但是還要兼顧頂點上連線的其他節點,不能一個不行就不行,所以走的路徑只返回走通的,走不通的略過,直到最後,能走到最後就說明根本沒有通的路徑,就這樣。

也可以把這個點上的所有連線點用深度遍歷走一次,然後看看記錄是否點亮的數組裡是不是亮著的,亮著就說明是有路徑,不亮就沒有
這裡鄰接表相關

//是否存在src到dest的路徑
bool isExitedPathDFS(Graph G,int src, int dest){
    
    int a;
    EdgeNode *p;
    //如果相同就返回真
    if(src == dest)
{ return true; } //既然不同走這裡,點亮第src元素 visited[src] = true; p = G.adjlist[src].firstedge; //用一個for迴圈來遍歷鄰接表上所有連著src元素的點 for (; p; p = p->next) { a = p->adj_vex_index; //因為要將每一個結果都要返回, //如果只是冒然返回isExitedPathDFS的結果,那有一條走不通就都走不同了 //所以這裡答案巧妙地做成在if語句裡走這個結果,而且只需要對的結果,錯誤的一律不反回
if(!visited[a] && isExitedPathDFS(G, a, dest)) { return true; } // if(!visited[a]){ // if(isExitedPathDFS(G, a, dest)){ // return true; // } // } } //執行到了最後就說明真沒有 return false; }

答案是怎麼想的?服氣