简体   繁体   English

C ++中图形的BFS和DFS

[英]BFS and DFS of a graph in C++

I have been trying to do a BFS and DFS of my graph. 我一直在尝试对图表进行BFS和DFS处理。 I have tried everything but still cannot figure out what is wrong with my algorithm. 我已经尝试了所有方法,但仍然无法弄清楚我的算法出了什么问题。 Please help me with this. 请帮我解决一下这个。

I send the vertices with is my vector that points to the vertexes of my graph to the bfs and bfs in order to go through it and seek for the correct values. 我将带有的顶点作为向量发送,该向量指向图的顶点指向bfs和bfs,以便遍历它并寻找正确的值。 I am new to this and am having a lot of problem trying to solve it. 我对此并不陌生,尝试解决它时遇到很多问题。 It would be nice if someone could go through my code and see where I am wrong in my algorithm. 如果有人可以浏览我的代码,看看我的算法在哪里出错,那将是很好的。 I hope a fresh pair of eyes would be able to detect the problem. 我希望能有新的发现。

It does show the output but is wrong! 它确实显示了输出,但是是错误的!

This is my input values for graph:: 5 1, 5 2, 5 3, 1 4, 1 6 这是我的图表输入值:: 5 1、5 2、5 3、1 4、1 6

Here 1 is the edge of 5, 2 is the edge of 5, 3 is the edge of 5 and so on.... 这里1是5的边缘,2是5的边缘,3是5的边缘,依此类推....

And this is the output I get: for BFS: 5,1,2,3,4,6 这是我得到的输出:对于BFS:5、1、2、3、4、6

for DFS: 5,4,3,2,1,5 对于DFS:5、4、3、2、1、5

Here is my algorithm for it: 这是我的算法:

#ifndef SORT_HPP
#define SORT_HPP

#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include <list>
#include <vector>
#include <stack>
#include <algorithm>
#include "clsVertex.hpp"
#include "clsFileGraph.hpp"
#include "clsGraph.hpp";

class bfs : public clsGraph{
    int vert;

public:
    bfs(int s, vector<clsVertex*> verticies); //prints BFS traversal from a given source

};

class dfs: public clsGraph{
    int vert;
    list<int> adj;

public:
    dfs(int s, vector<clsVertex*> verticies);   //prints DFS traversal from a given source

};

bfs::bfs(int s, vector<clsVertex*> verticies){

    bool *visited = new bool[verticies.size()]; //creates a new boolean array of the size of the graph

    for (int i = 0; i < verticies.size(); i++){ //loops till the end of the graph
        int x = verticies[i]->ID;   //gets the value of each vertex
            //cout << "The val: " << verticies[i]->ID << endl;
            visited[x] = false; //marks that vertex as unvisited i.e: visited = false
    }

    list<int> queue;    //creates a queue
    visited[s] = true;  //marks the starting point as visited
    queue.push_back(s); //adds the starting point to the queue
    cout << endl << "The breath first sort is as follows:-" << endl << endl;
    while (queue.size() != 0){  //loops until the size of the queue is 0 
        for (int i = 0; i < verticies.size(); i++){ //loops 
            int y = verticies[i]->edges.size();
            for (int j = 0; j < y; j++){
                int z = verticies[i]->edges[j]->ID;

                if (visited[z]== false){
                    visited[z] = true;
                    queue.push_back(z);
                }

            }
        }
        cout << s << ",";
        queue.pop_front();
        if (queue.size() == 0)
            goto here;
        s = queue.front();

    }
    here:
    cout << ID << " " << graphType << endl;
    for (int i = 0; i < verticies.size(); i++){
        cout << verticies[i]->ID << "->";
        for (int j = 0; j < verticies[i]->edges.size(); j++){
            cout << verticies[i]->edges[j]->ID << endl;
        }
    }

    cout << endl << endl << "Done" << endl << endl;
}




// DFS traversal of the vertices reachable from v. It uses recursive DFSUtil()
dfs::dfs(int s, vector<clsVertex*> verticies)
{
    // Mark all the vertices as not visited
    bool *visited = new bool[verticies.size()]; //creates a new boolean array of the size of the graph

    for (int i = 0; i < verticies.size(); i++){ //loops till the end of the graph
        int x = verticies[i]->ID;   //gets the value of each vertex
        //cout << "The val: " << verticies[i]->ID << endl;
        visited[x] = false; //marks that vertex as unvisited i.e: visited = false
    }
    stack <int> depth;
    visited[s] = true;
    depth.push(s);
    //cout << s << ",";
    while (depth.size() != 0){  //loops until the size of the queue is 0 
        for (int i = 0; i < verticies.size(); i++){ //loops 
            int y = verticies[i]->edges.size();
            for (int j = 0; j < y; j++){
                int z = verticies[i]->edges[j]->ID;

                if (visited[z] == false){
                    visited[z] = true;
                    depth.push(z);
                }

            }
        }
        cout << s << ",";
        depth.pop();
        if (depth.size() == 0)
            goto there;
        s = depth.top();

    }
there:
    cout << "done";

}
#endif

Your BFS method isn't working because you're adding vertices to your queue all out of order. 您的BFS方法无法正常工作,因为您要向队列中添加的所有顶点均乱序。 You should replace the inside of your while ( queue.size > 0 ) loop with something like: 您应该将while ( queue.size > 0 )循环的内部替换为:

s = queue.pop_front();
for ( int i = 0; i < vertices[s]->edges.size(); i++ ) {
    int tmp = vertices[s]->edges[i]->ID;
    if ( !visited[tmp] ) {
        visited[tmp] = true;
        queue.push_back(tmp);
    }
}
cout << s << " ";

As you have it at the moment, you add vertex 1's neighbours, then vertex 2's, and don't even reference your supposed starting point s. 目前,您添加了顶点1的邻居,然后添加了顶点2的邻居,甚至没有引用您假定的起点s。 You need to add only the neighbours of whichever vertex is currently at the front of your queue. 您只需要添加当前队列顶部哪个顶点的邻居即可。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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