BFS 解法
第15周題目
難度:MEDIA
題目:無權圖BFS實現
思考
用隊列保存每次要訪問的節點,然後每次拿出一個,如果當前這個是目標節點,就打印出距離,然後退出;如果不是,就把該節點周圍的且沒有被訪問過的節點壓入一個新隊列。當此時的隊列都拿完後,對新隊列進行相同的操作
代碼
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main() {
cout << "please input the node number: ";
int node_num;
cin >> node_num;
cout << "please input the distances of every two node" << endl
<< "the format must be as follow \" node_1 node_2 distance \" " << endl
<< "and end with input \" 0 \" " << endl;
int dis[node_num+1][node_num+1];
for (int i = 0; i < node_num+1; i++) {
for (int j = 0; j < node_num+1; j++) {
dis[i][j] = 0;
}
}
int node_1, node_2, distance;
while (1) {
cin >> node_1;
if (node_1 == 0) {
break;
}
cin >> node_2 >> distance;
dis[node_1][node_2] = distance;
dis[node_2][node_1] = distance;
}
for (int i = 0; i < node_num+1; i++) {
for (int j = 0; j < node_num+1; j++) {
cout << dis[i][j] << " ";
}
cout << endl;
}
cout << "please input start node : ";
int start_node, end_node;
cin >> start_node;
cout << "please input end node : ";
cin >> end_node;
int step = 0;
queue<int> trace;
trace.push(start_node);
vector<int> visited(node_num+1, 0);
while (1) {
queue<int> next_queue;
while (!trace.empty()) {
int current_node = trace.front();
trace.pop();
if (current_node == end_node) {
cout << "the total length is " << step << endl;
return 0;
}
for (int i = 1; i < node_num+1; i++) {
if (dis[current_node][i] != 0 && !visited[i]) {
next_queue.push(i);
visited[i] = 1;
}
}
}
step++;
trace = next_queue;
}
}