在图形循环中打印所有顶点

时间:2017-11-16 13:39:25

标签: algorithm graph cycle

我已根据此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

我做错了什么?

1 个答案:

答案 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等,然后使用WHITEGRAY等代替使用裸1,{{1等等。