題目:分別用基於深度優先遍歷和廣度優先遍歷算法判別以鄰接表方式存儲的有向圖中是否存在由頂點vi到頂點vj的路徑(i!=j)
注意,算法中涉及的圖的基本操作必須在此存儲結構中實現。
關鍵字: DFS&BFS,鄰接表,判斷指定路徑的存在
思路:
判斷指定路徑的存在,本質是不停地判斷兩個頂點是否存在鄰接關係。
作爲有向圖,對於是否存在頂點vi到vj的路徑(可以是好幾步纔到),只需要遍歷vi的所有鄰接點,在每個鄰接點下,遍歷看是否能查找到vj即可
實操:兩個不同的遍歷算法都採用從頂點vi出發,依次遍歷圖中各個頂點,直到搜索到頂點vj,若能搜索到vj,則說明存在由vi到頂點vj的路徑。
需要函數:判斷路徑是否存在函數 Exist_Path()
代碼:
DFS
int visited[MAXSIZE]={0};//訪問標記數組
int Exist_Path_DFS(ALGraph G,int i,int j){//判斷路徑是否存在的整體函數
int p;//頂點序號
if(i==j)
return 1;//當j=此時的i
else{//當i!=j時,纔開始通過遍歷來確認
visited[i]=1;//置訪問標記
for(p=FirstNeighbor(G,i);p>=0;p=NextNeighbor(G,i,p)){
if(!visited[p]&&Exist_Path_DFS(G,p,j))//遞歸檢測鄰接點
return 1;//i下游的頂點到j有路徑
}//for
}//else
return 0;
}
BFS
int visited[MAXSIZE]={0};//訪問標記數組
int Exist_Path_BFS(ALGraph G,int i, int j){//廣度優先判斷有向圖G中頂點vi到vj是否有路徑,是則返回1,否則返回0
InitQueue(Q);
EnQueue(Q,i);//頂點i入隊
while(!IsEmpty(Q)){//當隊列非空
DeQueue(Q,u);//隊頭頂點出隊
visited[u]=1;//更改訪問標記
for(p=FirstNeighbor(G,i);p;p=NextNeighbor(G,u,p)){//檢查所有鄰接點
k=p.adjvex;//k=p的所有鄰接點
if(k==j)//若k==j,則查找成功
return 1;
if(!visited[k])//否則,頂點k入隊
EnQueue(Q,k);
}//for
}//while
return 0;
}