微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用堆栈和 DFS 遍历检测有向图中的循环

如何解决使用堆栈和 DFS 遍历检测有向图中的循环

我正在尝试检测有向图中的循环。最初,我假设所有节点都未被访问,并且它们的值在 -1 中为 vector<int>flag. 现在我们从源节点开始并推入 stack<int>s 并使 flag[source]=0 成为它存在于堆栈中。现在,我将执行 DFS 遍历并将节点 if(flag[node]==-1)& make flag[node]=0 推入堆栈,从我首先推入的特定源开始。如果访问了所有 DFS 定向链接,我将弹出堆栈的顶部元素并将其标记flag[s.top()]=1; 在推送时,如果我们遇到一个带有 flag[nodes]==0 的节点,检测到循环,我会在 int final 变量中进行增量;`

我的代码工作正常,但有一个小问题。例如使用 number of vertices and edges =3 输入。

input edges:{1,3},{2,{3,2}

输入格式;

3 3
1 3
2 3
3 2

expected out: "Graph is cyclic" 

如果我将唯一的来源设为 2,那么我会得到正确的答案,但是如果我们必须将每个顶点作为源来检查它,所以我使用 for 循环,但现在我得到了错误输出 图形不是循环的。恳请询问为什么我的方法会出错。

我的代码

#include<iostream>
#include<vector>
#include<stack>
#include<map>
using namespace std;
int mx=1e5+5;
vector<bool>vist(mx);
vector<vector<int>>Graph(mx);
void dfs(int node,vector<int>&dfs_vec){
    vist[node]=true;
    dfs_vec.push_back(node);
    for(int neigh: Graph[node]){
        if(!vist[neigh]){
            dfs(neigh,dfs_vec);
        }
    }
}
int main(){
    int num_vertex;int num_edge;
    cin>>num_vertex>>num_edge;
    int u,v;
    for(int i=0;i<num_edge;i++){
        cin>>u>>v;
        Graph[u].push_back(v);
    }
    int final=0;
    for(int source=1;source<=num_vertex;source++){
    vector<int>flag(num_vertex+1,-1);
    stack<int>s;
    s.push(source);
    flag[source]=0;
    while(!s.empty()){
        int x=s.top();
        vector<int>temp;
        dfs(Graph[x][0],temp);
        for(auto y:temp){
            if(flag[y]==-1){
                s.push(y);
                flag[y]=0;
            }
            else if(flag[y]==0){
                finaL++;
            }
        }
        flag[s.top()]=1;
        s.pop();

    }
    flag.clear();
    while(!s.empty()){
        s.pop();
    }
    }
    if(final>0){
        std::cout<<" Graph is cyclic";
    }
    else{
        std::cout<<" Graph is not cyclic";
    }
} 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。