[英]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 調用這個函數的次數,給出斷開連接的子圖的數量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.