簡體   English   中英

使用 dfs 檢測循環並打印

[英]detect cycle and print with using 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;

}

感謝您的輸入。 問題已經解決。 push_back 必須在 for 循環的后面一行發生。 盡管如此,該代碼存在的問題是必須按特定順序創建鄰接表,以避免直接跳回到起點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM