图形:如何使用 DFS 检测无向图中的周期
Graph: How to detect cycles in a undirectd graph using DFS
以下是我的DFS实现,现在我想实现它,以便我可以检测图中是否存在任何循环(下面的代码基本上是用来查找连接元素的数量)
#include <iostream>
#include <vector>
using namespace std;
vector <int> adj[10];
int visited[10];
bool flag=false;
void dfs(int s) {
visited[s] = 0;
for(int i = 0;i < adj[s].size();++i) {
if(visited[adj[s][i]] == -1)
dfs(adj[s][i]);
else if (visited[adj[s][i]] ==1){
flag=true;
// cout<<"g";
return;
}
}
visited[s]=1;
}
void initialize() {
for(int i = 0;i < 10;++i)
visited[i] = -1;
}
int main() {
int nodes, edges, x, y ;
cin >> nodes; //Number of nodes
cin >> edges; //Number of edges
for(int i = 0;i < edges;++i) {
cin >> x >> y;
adj[x].push_back(y); //Edge from vertex x to vertex y
adj[y].push_back(x); //Edge from vertex y to vertex x
}
initialize(); //Initialize all nodes as not visited
for(int i = 1;i <= nodes;++i) {
if(visited[i] == false) {
dfs(i);
}
}
if (flag)
cout<<"Graph contains cycles"<<endl;
else
cout<<"No cycles"<<endl;
return 0;
}
我不确定如何实现它,任何人都可以帮助我。
编辑:我试图实现它。不知道我哪里出错了
我在初始化调用后将循环更改为:
for(int i = 0;i < nodes;++i) {
if(visited[i] == -1) {
dfs(i);
}
}
您的代码未开始检查,因为visited
中的每个元素都设置为 -1
,因此跳过。因此,通过此更改,它确实有效。
我建议查看全局变量的大小adj
和visted
,如果可能的话,使它们本地化。当输入 11 个或更多节点时,此代码将停止工作。
编辑问题"你能告诉我如何检查断开连接的图形吗?
将相同的循环更改为:
int nr_of_graphs = 0;
for(int i = 0;i < nodes;++i) {
if(visited[i] == -1) {
++nr_of_graphs;
dfs(i);
}
}
cout << "Nr of disconnected subgraphs " << nr_of_graphs << endl;
为每个尚未访问的节点调用dfs(i)
。所以计算从main调用这个函数的次数,给出断开连接的子图的数量。
相关文章:
- 使用CMake检测支持的C++标准
- 当套接字连接断开时检测C/C++Unix
- C/C++预处理器是否可以检测一些编译器选项
- WMI检测进程创建事件-c++
- 基于树莓pi的tensorflow lite量化ssd目标检测
- 下面是我为检测链接列表中的循环而制作的代码
- 落砂模拟碰撞检测C++和SFML
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 使用贝尔曼福特检测产品超过阈值的周期
- 具有周期检测的呼叫研磨性能分析
- 使用非递归 DFS 检测有向图中的周期
- 使用查找和联合检测图形中的周期
- 图形:如何使用 DFS 检测无向图中的周期
- 使用 Kruskal 算法检测图中的周期
- 如何以尽可能低的时间复杂度检测网格中的周期
- 如何检测C++随机引擎的整个周期已被消耗
- 无法使用 cin.get 来检测周期来中断循环
- 检测周期并使求和速度更快
- 是否有调试机制、解决方法、包装器或工具来检测shared_ptr周期
- 无向图的检测和打印周期