2017-06-15 39 views
-1

我想在C++中實現一個簡單的DFS,n節點數和k邊數。簡單的DFS卡在一個無限循環C++

出於某種原因,它是陷入無限循環:

#include <bits/stdc++.h> 
using namespace std; 

#define pb push_back 
#define MAXV 1000 

void addEdge(vector<int> adj[], int u, int v){ 
    adj[u].pb(v); 
    adj[v].pb(u); 
} 

void DFSUtil(int u, vector<int> adj[], vector<int>& visited){ 
    visited[u] = 1; 
    cout << u << " "; 
    for(int i = 0;i<adj[u].size();i++){ 
     if(visited[adj[u][i]] == 0){ 
      DFSUtil(u,adj,visited); 
     } 
    } 
} 

void DFS(vector<int> adj[], int N){ 
    vector<int> visited(N, 0); 
    for(int u = 1;u<N;u++){ 
     if(visited[u] == 0){ 
      DFSUtil(u,adj,visited); 
      cout << "\n"; 
     } 
    } 
} 

int main(){ 
    int n,k,m,i,u,v; 
    scanf("%d %d",&n,&k); 

    vector<int> adj[n+1]; 

    for(i = 0;i<k;i++){ 
     scanf("%d %d",&u,&v); 
     addEdge(adj,u,v); 
    } 

    // find connected components 
    DFS(adj,n+1); 


    return 0; 
} 

有人能指出我我我這個代碼去錯了地方?

樣品輸入來測試:

4 3 
1 2 
2 3 
1 4 
+2

您是否嘗試用調試器逐句通過您的代碼,找出_why_您的代碼卡在無限循環中? –

+0

我試着把printf語句和getchar()理解發生了什麼。我發現它陷入了DFSUtil函數中。但仍然不知道原因。 – user3243499

+0

我當然覺得在遞歸中修改傳遞的向量的方式有問題。 – user3243499

回答

1

通過每一個步驟完成操作後,終於,我能找到的bug。

傳遞的值應該是DFSUtil(adj[u][i],adj,visited);而不是DFSUtil(u,adj,visited);它實際上一次又一次調用同一個頂點,因此也是無限循環。

1
void DFSUtil(int u, vector<int> adj[], vector<int>& visited){ 
    visited[u] = 1; 
    cout << u << " "; 
    for(int i = 0;i<adj[u].size();i++){ 
     int to = adj[u][i]; 
     if(visited[to] == 0){ 
      DFSUtil(to, adj, visited); 
     } 
    } 
} 
+0

請解釋你的代碼。 – juzraai

+0

你不瞭解什麼? –

+0

不適合我,適合所有人。 :)只是發佈代碼塊而不指出你做了什麼/添加/修改以及爲什麼,沒有用,並可能導致降價。 – juzraai