簡體   English   中英

圖:如何使用 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 ,因此被跳過。 因此,通過此更改它確實有效。

我建議查看全局變量adjvisted大小,如果可能,將它們設為本地變量。 當輸入 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM