问题描述
我正在尝试检测有向图中的循环。最初,我假设所有节点都未被访问,并且它们的值在 -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 (将#修改为@)