【问题标题】:Directed Graph Adjacency Matrix Finding the Path有向图邻接矩阵寻找路径
【发布时间】:2016-04-25 03:09:19
【问题描述】:

我正在尝试使用 BFS 方法搜索我的图表,然后确定我的两个节点之间是否有路径。我理解它并且可以使用链表来实现它,但我只是无法用矩阵来掌握它。

我相信我在循环部分出错了,我觉得我在迭代错误的东西,或者比较错误的值。感谢您的帮助。

这是我的代码:

#include <iostream>
#include <queue>
#include <string.h>
#include <stack>
#include <list>

using namespace std;

class Graph{
private:
    int total_routes;
    int total_stations;
public:
    int AdjMatrix[100][100];
    Graph(int routes, int stations);

    void addRoute(int from, int to, int weight);
    void printGraph();
    bool isRoute(int from, int to);
};

Graph::Graph(int routes, int stations)
{
    for(int i = 0; i < stations; i++){
        for(int j=0; j < stations; j++){
            AdjMatrix[i][j]=0;
        }
    }
    total_routes = routes;
    total_stations = stations;
}

void Graph::printGraph(){
    cout << "\n" << endl;
    for(int i = 0; i < total_stations; i ++){
        for(int j = 0; j < total_stations; j++){
            cout << " " << AdjMatrix[i][j];
        }
        cout << endl;
    }
}

void Graph::addRoute(int from, int to, int weight){
    AdjMatrix[from][to] = weight;
}

bool Graph::isRoute(int from, int to){
    bool route = false;

    bool visited[total_stations] = {false};

    queue<int> verticies;

    if (from == to){
        cout << "Going into if its the same node statement" << endl;
        return true;
    }

    visited[from] = true;
    verticies.push(from);

    cout << "Testing if there is a route from " << from << " To " << to << endl;
    while(!verticies.empty() && route == false ){
        int current;
        current = verticies.front();
        verticies.pop();
        cout << "Going into for Loop, with a current value of " << current << endl;
        for ( int i = AdjMatrix[current][0]; i < total_stations ; i++ ){
            if (i == to ){
                route = true;
                break;
            }
            if ( visited[i] == false){
                visited[i] = true;
                verticies.push(i);
            }
        }
    }
    return route;
}

int main() {

    Graph newGraph(2,10);          //10 stations(Nodes), 2 routes
    newGraph.addRoute(0,1,10);     //Route from 1 to 2, with a weight of 10.
    newGraph.addRoute(2,9,1);      //Route of 2 to 9, with a weight of 1.
    newGraph.printGraph();
    bool answer = newGraph.isRoute(3,9); //Should say no route...
    if (answer){
        cout << "There is a route!" << endl;
    }
    else{
        cout << "There is no route!" << endl;
    }
    return 0;
}

【问题讨论】:

    标签: c++ loops graph adjacency-matrix breadth-first-search


    【解决方案1】:

    最好将 AdjMatrix[i][j] 初始化为 NULL

    那你就可以了

    for ( int i = 0; i < total_stations ; i++ ){
            if (AdjMatrix[current][i]!=NULL)
            {
                if (i == to ){
                   route = true;
                   break;
                }
                if ( visited[i] == false){
                   visited[i] = true;
                   verticies.push(i);
                }
            }
    

    【讨论】:

      【解决方案2】:

      你应该这样迭代

      for ( int i = 0; i &lt; total_stations ; i++ )

      并检查是否

      visited[i] == false &amp;&amp; AdjMatrix[current][i] != 0

      将新顶点推入队列。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多