为什么TopoSort只适用于某些图表,而其他图表则失败?

时间:2015-03-23 13:03:59

标签: c++ algorithm debugging graph-theory graph-algorithm

我最近了解了拓扑排序算法以及如何使用dfs和堆栈实现它,因此我编写了问题Reactivity Series的解决方案并直接实现了toposort。但我不确定为什么它会在测试用例#4上得到错误答案。测试用例不公开,所以我甚至不知道测试用例是坏的。

无论如何,我花了近1/2个小时试图纠正我的解决方案,创建测试用例等,但无法做出很多努力。任何有关调试的帮助将不胜感激。代码如下:

#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
using namespace std;

typedef vector<int> vi;
typedef vector<vi> vvi;

vvi graph;
vector<bool> flag;
stack<int> topo;

#define sz(C) int((C).size())

void dfs(int i)
{
    if(!flag[i])
    {
        flag[i] = true;
        for(vi::iterator it = graph[i].begin();it != graph[i].end();it++)
        {
            if(flag[*it])
            {
                printf("back to the lab\n");
                exit(0);
            }
            else
            {
                dfs(*it);
            }
        }
        topo.push(i);
    }
}

int main(void)
{
    int n, k, a, b;
    scanf("%d%d", &n, &k);
    graph.clear(); graph.resize(n); flag.resize(n, false);
    for(int i = 0;i < k;i++)
    {
        scanf("%d%d", &a, &b);
        graph[a].push_back(b);
    }

    dfs(0);

    while(!topo.empty())
    {
        printf("%d ", topo.top());
        topo.pop();
    }
    printf("\n");
}

提前致谢, 笔尖

2 个答案:

答案 0 :(得分:1)

您的代码将始终首先打印0。请注意,不要考虑没有有效拓扑排序且0作为第一个元素的情况。

答案 1 :(得分:0)

您的DFS仅检查图表中的一个连接组件:包含金属0的组件。您不能假设存在从此金属到每个其他组件的路径。

此外,当您检测到您之前看到的之前的某个顶点时,您似乎正在报告“返回实验室”(这可能是也可能不是周期的一部分 - 但无论如何,你已经在问题描述中告诉你输入中不能发生循环)。你没有测试正确的条件。