我最近了解了拓扑排序算法以及如何使用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");
}
提前致谢, 笔尖
答案 0 :(得分:1)
您的代码将始终首先打印0。请注意,不要考虑没有有效拓扑排序且0
作为第一个元素的情况。
答案 1 :(得分:0)
您的DFS仅检查图表中的一个连接组件:包含金属0的组件。您不能假设存在从此金属到每个其他组件的路径。
此外,当您检测到您之前看到的之前的某个顶点时,您似乎正在报告“返回实验室”(这可能是也可能不是周期的一部分 - 但无论如何,你已经在问题描述中告诉你输入中不能发生循环)。你没有测试正确的条件。