定向图邻接矩阵寻找路径

时间:2016-04-25 03:09:20

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

我正在尝试使用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;
}

2 个答案:

答案 0 :(得分:0)

用NULL

初始化AdjMatrix [i] [j]会更好

然后你可以做

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

答案 1 :(得分:0)

你应该以这种方式迭代

for ( int i = 0; i < total_stations ; i++ )

并检查是否

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

将新顶点推入队列。