//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上的运行时错误。
我在这里错过了什么吗?
答案 0 :(得分:0)
问题不在您的代码中,而是在您的示例中:
3 2
1 2
2 3
这里指的是一个包含3个顶点的图形(编号从0到2,因为从第一个示例和代码中可以看出这一点)。但添加的边连接顶点1 and 2
和2 and 3
。将2
的边添加到3
时没有错误(是的,这是一个逻辑错误,请考虑在此处添加断言,但由于此边缘被添加到邻接向量,因此不会发生崩溃顶点2)。但是在DFS中,从顶点2启动时会看到此边缘,并尝试检查是否访问了顶点3,从数组边界访问元素,即UB。
在调试器中可能会在2分钟内看到这一点,为什么不在发布问题之前调试代码?