简体   繁体   中英

Directed Graph Adjacency Matrix Finding the Path

I am trying to use the BFS method to search through my graph and then determine if there is a path between my two nodes. I understand it and can implement it with a linked list, but I am just having trouble grasping it with a matrix instead.

I believe I am going wrong in my looping section, I feel like I am iterating on the wrong thing, or maybe comparing the wrong values. Thanks for any help.

Here is the code I have:

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

It would be better to initialize AdjMatrix[i][j] with NULL

Then you can do

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

You should iterate over this way

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

and check whether

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

to push new vertices into the queue.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM