圖的廣度優先遍歷(bfs)

廣度優先遍歷:

1.將起點s 放入隊列Q(訪問)ios

2.只要Q不爲空,就循環執行下列處理spa

(1)從Q取出頂點u 進行訪問(訪問結束)code

(2)將與u 相鄰的未訪問頂點v 放入Q, 同時將d[v]更新爲d[u] + 1blog

 

主要變量

M[n][n] 鄰接矩陣,若是存在頂點i到頂點j 的邊,則M[i][j] 爲true
Queue Q 記錄下一個待訪問頂點的隊列
d[n]

將起點s 到個頂點i的最短距離記錄在d[i]中。隊列

s沒法到達i 時d[i] 爲INFTY(極大值)ci

 

 

 

 

 

 

 1 #include<iostream>
 2 #include<queue>
 3 using namespace std;
 4 
 5 static const int N = 100;
 6 static const int INFTY = (1 << 21);
 7 
 8 int n, M[N][N];
 9 int d[N];//用來存儲v到起始頂點的距離 
10 
11 void bfs(int s) {
12     queue <int> q;
13     q.push(s);//起始頂點 入隊 
14     //設置初始值, 經過判斷距離大小來明白該頂點是否被訪問 
15     for(int i = 0; i < n; i++)    d[i] = INFTY;
16     d[s] = 0;//初始值爲0 
17     int u;
18     while( !q.empty() ) {
19         u = q.front();
20         q.pop();
21         //檢索與該頂點有鏈接的頂點,併入隊 
22         for(int v = 0; v < n; v++) {
23             if(M[u][v] = 0)    continue;
24             //若是該頂點被訪問過 
25             if(d[v] != INFTY)    continue;
26             //該頂點與起始頂點的距離等於,上一個頂點與起始頂點距離加1 
27             d[v] = d[u] + 1;
28             q.push(v);
29         }
30     }
31     //輸出,若未被訪問則輸出-1 
32     for(int i = 0; i < n; i++) {
33         cout << i + 1 << " " << ( (d[i] == INFTY) ? (-1) : d[i] ) << endl;
34     }
35 }
36 
37 int main() {
38     int u, k, v;
39     cin >> n;
40     //初始化 
41     for(int i = 0; i < n; i++) {
42         for(int j = 0; j < n; j++) 
43             M[i][j] = 0;
44     }
45     //輸入數據構建鄰接矩陣 
46     for(int i = 0; i < n; i++) {
47         cin >> u >> k;
48         u--;
49         for(int j = 0; j < k; j++) {
50             cin >> v; 
51             v--;
52             M[u][v] = 1;
53         }
54     }
55     //廣度優先遍歷 
56     bfs(0);
57     
58     return 0;
59 }
60 
61 /*
62 4
63 1 2 2 4
64 2 1 4
65 3 0 
66 4 1 3
67 */
相關文章
相關標籤/搜索