检测循环并使用dfs进行打印

时间:2017-08-26 18:50:31

标签: c++ graph dfs

我试图从一个给定的顶点开始,在无向路径中检测并打印一个循环。到目前为止,路径记录在矢量中。代码似乎有效,但报告的顶点比它应该多一个。

对于给定的例子,一个预期的路径是:-1,6,0,5,3也是:-1,6,0,5,3,2但是还有一个顶点比预期。

也许有人知道如何解决这个问题。

提前致谢!

#include <vector>
#include <iostream>


class Vertex
{
public:
    Vertex() {};
    Vertex(int x, int y, bool visited) : _x(x), _y(y){}
    int _x;
    int _y;
};


class Edge
{
public:
    Edge(Vertex* from, Vertex* to): _from(from), _to(to){} 
    Vertex* _from;
    Vertex* _to;
};

class MyGraph
{

public:
void addVertex(int x, int y, bool visited);
void addEdge(Vertex* vp1, Vertex* vp2);

bool dfs(int v, int p);

std::vector<std::vector<int>> g; 
bool* visited;
std::vector<Edge> edges;
std::vector<Vertex> vertices;
std::vector<int>path;

};


void MyGraph::addVertex(int x, int y, bool visited)
{
    Vertex v = Vertex(x, y, visited);
    this->vertices.push_back(v);
}


void MyGraph::addEdge(Vertex* vp1, Vertex* vp2)
{
    Edge e = Edge(vp1, vp2);
    this->edges.push_back(e);
}


bool MyGraph::dfs(int v, int p)
{

    visited[v] = true;

    this->path.push_back(p);

    for (int i = 0; i < (int)g[v].size(); i++)
    {
       if (!visited[g[v][i]])
       {
           dfs(g[v][i], v);
           return true;
       }
        if (g[v][i] != p)
       {
           return true;
       }
    }

    this->path.pop_back();
    return false;

}

int main(int argc, char** argv)
{
    MyGraph mg;

    mg.addVertex(3, 0, false);
    mg.addVertex(0, 1, false);
    mg.addVertex(2, 1, false);
    mg.addVertex(0, 2, false);
    mg.addVertex(1, 2, false);
    mg.addVertex(3, 2, false);
    mg.addVertex(0, 0, false);


    mg.g.resize(mg.vertices.size());

    mg.g[0].push_back(5);
    mg.g[0].push_back(6);

    mg.g[1].push_back(2);
    mg.g[1].push_back(3);
    mg.g[1].push_back(6);

    mg.g[2].push_back(1);

    mg.g[3].push_back(2);
    mg.g[3].push_back(4);
    mg.g[3].push_back(5);
    mg.g[3].push_back(6);

    mg.g[4].push_back(3);
    mg.g[4].push_back(5);

    mg.g[5].push_back(0);
    mg.g[5].push_back(3);   
    mg.g[5].push_back(4);   

    mg.g[6].push_back(0);
    mg.g[6].push_back(1);
    mg.g[6].push_back(3);


    // expected path: 6,0,5,3
    mg.visited = new bool[mg.vertices.size()]{false};   

    std::vector<int> pppath;
    std::cout << mg.dfs(6, -1) << std::endl;

    for (auto n : mg.path)
    {
        std::cout << n << ",";
    }

  return 0;

}

1 个答案:

答案 0 :(得分:1)

感谢您的投入。问题已经解决了。 push_back必须在for循环中稍后发生。尽管如此,代码还存在必须按特定顺序创建邻接列表以避免直接跳回起点的问题。