如何解决如何在不使用重复的情况下执行 DFS 时记录两个时间戳?
在图中执行 DFS
时,使用两个时间戳来跟踪节点何时被访问以及节点的所有邻居何时都已被访问是很重要的。有时我们需要记录这两个时间戳。我已经知道如何使用重复来做到这一点。但是我在尝试不重复(使用例如循环和堆栈)来编写 DFS
函数时遇到了问题。
我已经尝试了常见的迭代 DFS
方法:
unsigned int time = 0;
stack<int> nodeStack = stack<int>();
vector<int> nodeVec = vector<int>(graph.size(),null); // null means not visited
vector<pair<int,int>> nodeTimeStamp = vector<pair<int,int>>(graph.size(),pair<int,int>{0,0});
list<int> firstTimeList = list<int>();
list<int> lastTimeList = list<int>();
bool isAcyclic = true;
for (int i = 0; i < graph.size(); i++) {
if (nodeVec.at(i) == null) {
stack<int> nodeStack = stack<int>();
nodeStack.push(i);
firstTimeList.push_front(i);
nodeTimeStamp.at(i).first = time ++;
nodeVec.at(i) = visited;
while (!nodeStack.empty()) {
auto u = nodeStack.top();
if (nodeVec.at(u) == discovered) {
lastTimeList.push_front(u);
nodeTimeStamp.at(u).second = time ++;
nodeStack.pop();
}
for (int j = 0; j < graph.at(u).size(); j++) {
int v = graph.at(u).at(j).first;
if (nodeVec.at(v) == null) {
nodeStack.push(v);
firstTimeList.push_front(v);
nodeTimeStamp.at(v).first = time ++;
nodeVec.at(v) = visited;
}
else
isAcyclic = false;
}
nodeVec.at(u) = discovered;
}
}
}
它不起作用,因为它会在搜索时将一个节点的所有邻居推入堆栈。因此我们无法记录何时以这种方式访问了一个节点。能否请您帮我想想在执行 DFS
不使用重复时记录两个时间戳?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。