BFS 解法

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;
    }
}

實現效果

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章