我已根据此Algorithm to find and print simple cycle in complexity of O(n) on undirected graph进行了尝试。 根据我的导师,它是否在 C ++ 中完成,以下是我的代码:
int parent[1000] = {0};
int status[1000] = {0};
bool oriented = true;
#include ...
using namespace std;
array<list<int>, 1000 + 1> g;
void PrintCycle(int v, int u) {
do {
printf("%d",u);
u = parent[u];
} while (u != v);
}
bool DFS_cycle(int u) {
status[u] = 1;
for (int v:g[u]) {
if (status[v] == 0) {
parent[v] = u;
DFS_cycle(v);
}
if (status[v] == 1 && v != parent[u]) {
PrintCycle(v,u);
}
}
status[u] = 2;
}
int main() {
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int N, u, v;
cin >> N;
while (cin >> u >> v) {
g[u].push_back(v);
g[v].push_back(u);
}
parent[1] = 1;
DFS_cycle(1);
return 0;
}
但它不适用于以下输入:(第一行是顶点数。顶点从1开始编号。之后每行描述一条边。)
8
3 1
3 4
3 2
2 5
2 6
6 7
6 8
我做错了什么?
答案 0 :(得分:0)
首先,您使用的是 C ++ 而不是 C 。
对于给定的输入,否循环。它也不打印任何循环。因此, 适用于给定的输入。
但是,您的代码有错误。如果我们添加另一个边(5,8)
,则形成一个周期(2 -> 5 -> 8 -> 6)
。但是您的代码将周期打印为(6 -> 8 -> 5)
。
查看我的代码以查找您的错误:
void PrintCycle(int v, int u) {
while(u != v)
{
printf("%d ",u); // You didn't give any space after %d
// It could not be possible to differentitate between '1''2'
// and '12'
u = parent[u];
}
printf("%d \n", v);
}
bool DFS_cycle(int u) {
status[u] = 1;
for (int v:g[u]) {
if (status[v] == 0) {
parent[v] = u;
DFS_cycle(v);
}
else if (status[v] == 1 && v != parent[u]) { // It should be 'else if' NOT 'if'
PrintCycle(v,u);
break;
}
}
status[u] = 2;
}
最好#define WHITE 0
,#define GRAY 1
等,然后使用WHITE
,GRAY
等代替使用裸1
,{{1等等。