DFS BFS 公路搜尋 單向公路 OJ1107

2021-09-09 05:36:22 字數 2295 閱讀 2388

參考部落格

題目描述

某個地區有許多城鎮,但並不是每個城鎮都跟其他城鎮有公路連線,且有公路的並不都能雙向行駛。現在我們把這些城鎮間的公路分布及允許的行駛方向告訴你,你需要程式設計解決通過公路是否可以從乙個城鎮到達另乙個城鎮。(我們規定,城鎮自己跟自己可互相到達,即a可到達a).

輸入要求

第一行只有乙個數n,下面將跟著2n行資料. 在前n行資料中,對於每行資料,最開頭乙個數字number,表明這一行總共有number個數,number的下乙個數為i,代表編號為i的那個城鎮.這行餘下的就是跟i有公路連線的城鎮的名單,且只能從城鎮i駛向其他城鎮。如 4 1 2 3,表明:此行有4個數,跟城鎮1有公路連線的城鎮是編號為2和3的城鎮,且只允許從城鎮1駛向城鎮2和3,而不能從2到1或3到1。 在後n行資料中,每行由兩個數字組成a,b. 對於每個輸入的數有如下關係 0 <= input_number <= 1000 .

輸出要求

對於輸入資料中的每個a,b,判斷是否可以從城鎮a通過公路到達城鎮b,如果可以,輸出yes;否則輸出no.

輸入樣例

4 1 2 3

3 4 5

3 5 8

1 21 8

4 8輸出樣例

yesnoyes

思路分析

典型的dfs(深度優先搜尋)、bfs(廣度優先搜尋)問題,涉及有關知識點:佇列、圖。

解決方式

1.dfs

2.bfs

圖的概念:圖/13018767#viewpagecontent

佇列的概念:佇列/14580481?fr=aladdin

搜尋演算法:搜尋演算法/2988274?fr=aladdin

c++中佇列的使用和實現:

dfs與bfs詳解(兩種搜尋的模板寫的很好):

ac**

1.dfs

#include#include#define max 1010

int vis[max];//記錄走過的城鎮,如果為0則表示沒走過,為1表示走過,初始為0

int roadmap[max][max];//用二維陣列的形式記錄由乙個城鎮能到達的其他城鎮的編號

int len[max];//每個城鎮能到達其他城鎮的數量(用於節省時間)

int flag;//判斷是否能到達目的地

int bg,ed;//深搜起始點和終止點。

void dfs(int bg)

for(i = 0; i < len[bg]; i++)

}}int main()

}for(i = 0; i < n; i++)

return 0;

}

2.bfs

#include#include#include#define max 1010

using namespace std;

int vis[max];//記錄走過的城鎮,如果為0則表示沒走過,為1表示走過,初始為0

int roadmap[max][max];//用二維陣列的形式記錄由乙個城鎮能到達的其他城鎮的編號

int len[max];//每個城鎮能到達其他城鎮的數量(用於節省時間)

int flag;//判斷是否能到達目的地

int bg,ed;//廣度搜尋的起始點和終止點。

queueque;//佇列定義

void bfs()

for(int i = 0; i < len[fir]; i++)}}

}int main()

}for(i = 0; i < n; i++)

return 0;

}

總結及錯誤分析

bfs與dfs需要的準備工作:

1.用陣列形式儲存相關圖(map)

2.用乙個陣列(vis)記錄已經訪問過的節點

(3.可用乙個額外陣列(len)記錄元素個數節省時間)

錯誤分析:

1.沒用vis陣列正確記錄訪問情況,導致超時和結果錯誤。

2.對於多組資料的vis以及flag等標誌資料的初始化工作

bfs 單向公路 C

描述 某地區有許多城鎮,但並不是每個城鎮都跟其他城鎮有公路連線,並且有的公路並不能雙向行駛。現在我們把這些城鎮間的公路分布及允許的行駛方向告訴你,你需要程式設計解決通過公路是否可以從乙個城鎮到達另乙個城鎮。我們規定,城鎮自己跟自己可互相到達,即 a 可到達 a 輸入第一行只有乙個數 n 下面將跟著 ...

DFS BFS搜尋 題目

這篇博主寫的是圖的深搜 圖的dfs附 圖的深度優先遍歷 出處 一條魚 2011 12 26 include include struct node 圖頂點結構定義 typedef struct node graph 圖形的結構新型態 struct node head 9 圖形頂點陣列 int vis...

DFS BFS 搜尋訓練

hdu 1016 include include include using namespace std int prime 40 vis 40 num 40 n void checkprime void dfs int i for int c 2 c n c int main return 0 p...