2014-10-16 71 views
0

我在與歌廳我的DFS正常工作的問題。 該圖conected這樣的:向DFS在java中

0 --> 1 
0 --> 5 
5 --> 4 
4 --> 3 
4 --> 2 
2 --> 3 
2 --> 0 
3 --> 2 
3 --> 5 

所以後,我運行它通過我的DFS的結果應該是:

0,1,5,4,2,3 

,但我發現

0,1,5,2,3,4 

繼承人的代碼:

package kth.id2010.lab.lab05; 

public class DFS { 

    static void dfs(int edges[][], int vertex, boolean[] visited){   
     visited[vertex] = true; 
     for(int i = vertex + 1; i < edges[vertex].length; i++){ 
      if(edges[vertex][i] == 1 && !visited[i]){ 
       dfs(edges,i,visited); 
      } 
     } 
    } 

    public static void main(String[] args){ 
     int n = 6; 
     int[][] edges = new int[n][n]; 
     boolean[] visited = new boolean[n]; 
     //Vertex nr: 0 
     edges[0][0] = 0; 
     edges[0][1] = 1; //0 --> 1 
     edges[0][2] = 0; 
     edges[0][3] = 0; 
     edges[0][4] = 0; 
     edges[0][5] = 1; //0 --> 5 
     //Vertex nr: 1 
     edges[1][0] = 0; 
     edges[1][1] = 0; 
     edges[1][2] = 0; 
     edges[1][3] = 0; 
     edges[1][4] = 0; 
     edges[1][5] = 0; 
     //Vertex nr: 2 
     edges[2][0] = 1; //2 --> 0 
     edges[2][1] = 0; 
     edges[2][2] = 0; 
     edges[2][3] = 1; //2 --> 3 
     edges[2][4] = 0; 
     edges[2][5] = 0; 
     //Vertex nr: 3 
     edges[3][0] = 0; 
     edges[3][1] = 0; 
     edges[3][2] = 1; //3 --> 2 
     edges[3][3] = 0; 
     edges[3][4] = 0; 
     edges[3][5] = 1; //3 --> 5 
     //Vertex nr: 4 
     edges[4][0] = 0; 
     edges[4][1] = 0; 
     edges[4][2] = 1; //4 --> 2 
     edges[4][3] = 1; //4 --> 3 
     edges[4][4] = 0; 
     edges[4][5] = 0; 
     //Vertex nr: 5 
     edges[5][0] = 0; 
     edges[5][1] = 0; 
     edges[5][2] = 0; 
     edges[5][3] = 0; 
     edges[5][4] = 1; //5 --> 4 
     edges[5][5] = 0; 
     for(int i = 0; i <n; i++){ 
      visited[i] = false; 
     } 
     for(int i = 0; i <n; i++){ 
      if(visited[i] == false){ 
       dfs(edges,i,visited); 
      } 
     } 
    } 
} 

我真的不知道爲什麼在3次後停止工作。

回答

2

我注意到的事情是,你開始與我=頂點+ 1,因此以後你達到頂點5將返回的地方,我們從頂點0進入的主要方法,並繼續與頂點2,而不是頂點4作爲預期。所以更改以下行:

static void dfs(int edges[][], int vertex, boolean[] visited){   
    visited[vertex] = true; 
    for(int i = vertex + 1; i < edges[vertex].length; i++){ 
     ... 

到:

for(int i = 0; i < edges[vertex].length; i++){ 
+0

其實他在最後的循環隱藏在'主自己的錯誤()',它會重新開始爲每個頂點,因此所有的頂點得到包括在內。 – Sirko 2014-10-16 12:51:29

+0

上帝現在我覺得自己很愚蠢,討厭這樣簡單。 – Necrozze 2014-10-16 12:52:58

+0

但這很好,我們想要包括所有這些(例如,如果我們有多個未連接的子圖)?首先是相互連接的那些:) – Icewind 2014-10-16 12:53:23