为什么下面提到的代码仅适用于特定的输入集?

时间:2016-08-12 07:55:36

标签: c++ depth-first-search

//DFS of connected and disconnected graphs

#include <iostream>
#include <vector>

using namespace std;

class Graph {
    int V;
    vector<int> *adj;
    void DFSutil(int v, bool visited[]);
public: 
    Graph(int V);
    void addEdge(int v, int w);
    void DFS();
    //void DFS(int v); for connected
};

Graph::Graph(int V) {
    this->V = V;
    adj = new vector<int>[V];
}

void Graph::addEdge(int v, int w) {
    adj[v].push_back(w);
}

void Graph::DFSutil(int v, bool visited[]) {
    visited[v] = true;
    cout << v << " ";

    vector<int>::iterator i;
    for (i=adj[v].begin(); i!= adj[v].end(); ++i)
        if(!visited[*i]) 
            DFSutil(*i,visited);
}

void Graph::DFS() {
    bool* visited = new bool[V];
    for (int i=0; i<V; ++i) {
        visited[i] = false;
    }

    for (int i=0; i<V; ++i) {
        if (visited[i] == false)
            DFSutil(i, visited);
    }

    // simply DFSutil(v,visited) if you are sure every vertex is reachable from any vertex, i.e., graph is connected

}

int main()
{
    // Create a graph given in the above diagram
    int N, E, N1, N2;
    cin >> N >> E;
    Graph g(N);
    while(E--) {
        cin >> N1 >> N2;
        cout << N1 << " " << N2 <<" added" << endl;
        g.addEdge(N1, N2);
    }

    cout << "Following is Depth First Traversal\n";
    g.DFS();
    //g.DFS(2) for connected

    return 0;
}

以上是DFS的一个简单实现,它适用于连接和断开连接的图形,包括树。 对于输入(连接图) -

4 6
0 1
0 2
1 2
2 0 
2 3
3 3

它显示成功,但输入(树) -

3 2
1 2
2 3

它显示Ideone上的运行时错误。

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:0)

问题不在您的代码中,而是在您的示例中:

3 2
1 2
2 3

这里指的是一个包含3个顶点的图形(编号从0到2,因为从第一个示例和代码中可以看出这一点)。但添加的边连接顶点1 and 22 and 3。将2的边添加到3时没有错误(是的,这是一个逻辑错误,请考虑在此处添加断言,但由于此边缘被添加到邻接向量,因此不会发生崩溃顶点2)。但是在DFS中,从顶点2启动时会看到此边缘,并尝试检查是否访问了顶点3,从数组边界访问元素,即UB。

在调试器中可能会在2分钟内看到这一点,为什么不在发布问题之前调试代码?