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 */