2011-12-24 18 views
0

このコードは、幅広い最初の検索を実装しています。幅優先検索 - 間違った結果

#define N 9  //nodes 
#define MAXNUM 65555 
#define FALSE 0 
#define TRUE 1 

int main() { 
int i, j; 
int network[N][N]; //Adjacency matrix 
int dist[N]; //distances from node u 
int u = 0; //choose first node 
void bfs(int, int [N][N], int [N]); 

for (i = 0; i < N; i++) { 
    dist[i] = MAXNUM; 
    for (j = 0; j < N; j++) { 
     if (i == j) { 
      network[i][j] = 0; 
     } else { 
      network[i][j] = MAXNUM; 
      network[j][i] = MAXNUM; 
     } 
    } 
} 

network[0][1]=1; network[0][3]=1; network[0][5]=1; 
network[1][0]=1; network[1][2]=1; network[1][6]=1; 
network[2][1]=1; network[2][3]=1; network[2][7]=1; 
network[3][0]=1; network[3][2]=1; network[3][4]=1; 
network[4][3]=1; network[4][5]=1; network[4][7]=1; 
network[5][0]=1; network[5][4]=1; network[5][6]=1; 
network[6][1]=1; network[6][5]=1; network[6][7]=1; 
network[7][2]=1; network[7][4]=1; network[7][6]=1; 

bfs(u, network, dist); 

return 0; 
} 

void bfs(int u, int network[N][N], int dist[N]) { 
int w, v, onScanQ[N], ScanQ[N], Qsize = 0; 
int k; 

for (v = 0; v < N; v++) { 
    dist[v] = MAXNUM; 
    onScanQ[v] = FALSE; 
} 

dist[u] = 0; 
ScanQ[1] = u; 
onScanQ[u] = TRUE; 
Qsize = 1; 
k = 1; 

printf("\nBFS has started examining:\n"); 

do { 
    v = ScanQ[k]; 
    printf("%d ", v); 
    for (w = 0; w < N; w++) { 
     if ((network[v][w] < MAXNUM) && (!onScanQ[w])) { 
      Qsize++; 
      ScanQ[Qsize] = w; 
      onScanQ[w] = TRUE; 
      dist[w] = dist[v] + 1; 
      printf("(%d) ", w); 
     } 
     k++; 
    } 
} while (k <= Qsize); 
    printf("\n");} 

しかし、その代わりに、これらの結果の:BFSは検査開始した

: 0(1)(3)(5)1(2)(6)3(4)5 2(7 0(1)(3)(5):

BFS検査開始した:私は、これは、出力から取る)6 4 7

何が欠けていますか?

+0

デバッガであなたのコードをステップするとき、あなたは何を発見したのですか? –

+1

ScanQ、onScanQなどの内部データ構造について説明してください。 v/wのようなカウンタ/インデックス。あなたの出力フォーマット - これは "0(1)(3)(5)"を意味しますか?あなたはこれをデバッグしようとしましたか?あなたの経験を共有してください! –

+0

私はC言語で新しく、デバッグしようとしませんでした。私はそれを試みます。ネットワークはキューブです(http://img861.imageshack.us/img861/2667/networkcube.jpg)。このネットワークがこのコードに接続されているかどうかを確認しようとします。アルゴリズムは最初のノード(u = 0)をチェックします。 ScanQはスキャンされたノードであり、onScanQはスキャンの次のノードです。出力は、センテンスなしで第1のノードu = 0を与え、文の中にその隣接ノードを与える。 – John

答えて

1

速いprintfがwhileループ内にあるということは、whileの状態がtrueと等しくないことを示しています。

printf("Qsize=%d k=%d\n", Qsize, k); 
} while (k <= Qsize); 

出力:

Qsize=4 k=10 
+0

ありがとう!カウンターkの位置が間違っていた。正しい位置はforループの後です。 – John

+0

'do {...} while(...);'ループの代わりに 'for(k = 0; k wildplasser