[英]Why doesn't my code work?
我正在為有向圖實現一個簡單的DFS遍歷:
#include <iostream>
#include <vector>
#include <climits>
#include <utility>
#include <deque>
#include <queue>
#include <algorithm>
#include <iomanip>
#include <list>
using namespace std;
enum class color_type {
BLACK,
WHITE,
GRAY
};
struct vertex {
char label;
color_type color;
int start;
int finish;
vertex *parent;
vector<vertex> adjacents;
vertex(char label)
:label(label), start(0), finish(0), color(color_type::WHITE) {
}
void add_neighbor(const vertex &v) {
adjacents.push_back(v);
}
};
class digraph {
private:
vector<vertex> vertices;
int count;
public:
digraph()
:count(0) {
vertex a('a');
vertex b('b');
vertex c('c');
add_edge(a, b);
add_edge(b, c);
add_edge(c, a);
vertices.push_back(a);
vertices.push_back(b);
vertices.push_back(c);
for (int i = 0; i < vertices.size(); ++i) {
vertices[i].color = color_type::WHITE;
vertices[i].parent = NULL;
}
}
void add_edge(vertex &u, vertex &v) {
u.add_neighbor(v);
}
void dfs() {
dfs_visit(vertices[0]);
}
void dfs_visit(vertex &u) {
count++;
u.start = count;
u.color = color_type::GRAY;
cout << "??? visit = " << u.label << endl;
cout << "# neighbors: " << u.adjacents.size() << '\n';
for (int i = 0; i < u.adjacents.size(); ++i) {
if (u.adjacents[i].color == color_type::WHITE) {
cout << "visit neighbor of [" << u.label << "] is: " << u.adjacents[i].label << endl;
u.adjacents[i].parent = &u;
dfs_visit(u.adjacents[i]);
}
}
u.color = color_type::BLACK;
count++;
u.finish = count;
}
public:
friend ostream& operator <<(ostream& o, const digraph &dg) {
for (int i = 0; i < dg.vertices.size(); ++i) {
o << dg.vertices[i].label << ":\n";
o << "\t start = " << dg.vertices[i].start << endl;
o << "\t finish = " << dg.vertices[i].finish << endl;
}
return o;
}
};
int main() {
digraph dg;
dg.dfs();
cout << dg << endl;
return 0;
}
問題是對dfs_visit()
的調用在訪問第二個頂點后停止。 我通過引用將頂點u
作為dfs_visit()
函數的參數dfs_visit()
,但是不知何故頂點b
的鄰居數突然變為0
,這很奇怪。
在我看來,矢量vertices
中存儲的vertices
與傳遞給dfs_visit
,但是我真的不知道這種情況如何。 我使用Java已經有一段時間了,現在我對C ++感到很生疏。 那么,有人能給我一些有關此問題的信息嗎?
編輯
使用鄰居的指針,這可能更接近您要查找的內容。 希望這可以幫助。 最終,區別在於主頂點容器中鄰居的按指針尋址,而不是在代碼中創建的所有副本。
注意:add-construction只是將一個節點設置為在頂點集合中將“下一個”節點作為其鄰居,最后一個節點成為第一個鄰居。 這似乎是您的代碼試圖實現的目標。
#include <iostream>
#include <vector>
#include <climits>
#include <utility>
#include <deque>
#include <queue>
#include <algorithm>
#include <iomanip>
#include <list>
using namespace std;
enum class color_type {
BLACK,
WHITE,
GRAY
};
struct vertex {
char label;
color_type color;
int start;
int finish;
vertex *parent;
vector<vertex*> adjacents;
vertex(char label)
:label(label), start(0), finish(0), color(color_type::WHITE) {
}
void add_neighbor(vertex &v) {
adjacents.push_back(std::addressof(v));
}
};
class digraph {
private:
vector<vertex> vertices;
int count;
public:
digraph()
:count(0) {
vertices.push_back(vertex('a'));
vertices.push_back(vertex('b'));
vertices.push_back(vertex('c'));
for (size_t i=0; i<vertices.size(); ++i)
{
vertices[i].color = color_type::WHITE;
vertices[i].parent = NULL;
vertices[i].add_neighbor(vertices[(i+1)%vertices.size()]);
}
}
void dfs() {
dfs_visit(vertices[0]);
}
void dfs_visit(vertex &u) {
count++;
u.start = count;
u.color = color_type::GRAY;
cout << "??? visit = " << u.label << endl;
cout << "# neighbors: " << u.adjacents.size() << '\n';
for (int i = 0; i < u.adjacents.size(); ++i) {
if (u.adjacents[i]->color == color_type::WHITE) {
cout << "visit neighbor of [" << u.label << "] is: " << u.adjacents[i]->label << endl;
u.adjacents[i]->parent = &u;
dfs_visit(*(u.adjacents[i]));
}
}
u.color = color_type::BLACK;
count++;
u.finish = count;
}
public:
friend ostream& operator <<(ostream& o, const digraph &dg) {
for (int i = 0; i < dg.vertices.size(); ++i) {
o << dg.vertices[i].label << ":\n";
o << "\t start = " << dg.vertices[i].start << endl;
o << "\t finish = " << dg.vertices[i].finish << endl;
}
return o;
}
};
int main() {
digraph dg;
dg.dfs();
cout << dg << endl;
return 0;
}
產量
??? visit = a
# neighbors: 1
visit neighbor of [a] is: b
??? visit = b
# neighbors: 1
visit neighbor of [b] is: c
??? visit = c
# neighbors: 1
a:
start = 1
finish = 6
b:
start = 2
finish = 5
c:
start = 3
finish = 4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.