繁体   English   中英

C ++中图形的BFS和DFS

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

我一直在尝试对图表进行BFS和DFS处理。 我已经尝试了所有方法,但仍然无法弄清楚我的算法出了什么问题。 请帮我解决一下这个。

我将带有的顶点作为向量发送,该向量指向图的顶点指向bfs和bfs,以便遍历它并寻找正确的值。 我对此并不陌生,尝试解决它时遇到很多问题。 如果有人可以浏览我的代码,看看我的算法在哪里出错,那将是很好的。 我希望能有新的发现。

它确实显示了输出,但是是错误的!

这是我的图表输入值:: 5 1、5 2、5 3、1 4、1 6

这里1是5的边缘,2是5的边缘,3是5的边缘,依此类推....

这是我得到的输出:对于BFS:5、1、2、3、4、6

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

这是我的算法:

#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

您的BFS方法无法正常工作,因为您要向队列中添加的所有顶点均乱序。 您应该将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 << " ";

目前,您添加了顶点1的邻居,然后添加了顶点2的邻居,甚至没有引用您假定的起点s。 您只需要添加当前队列顶部哪个顶点的邻居即可。

暂无
暂无

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

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