2011-12-24 100 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 )6 4 7

我從輸出,僅此:

BFS已經開始研究: 0(1)(3)(5)

什麼是缺失?

+0

你是怎麼發現,當你通過代碼在調試器階梯? – 2011-12-24 13:36:29

+1

您能否介紹一下您的內部數據結構,如ScanQ,onScanQ;計數器/索引像v,w;你的輸出格式 - 這是什麼意思「0(1)(3)(5)」? - 主要是你的算法! .. OTOH你有沒有嘗試去調試呢?請分享您的經驗! – 2011-12-24 13:44:30

+0

我是C新手,並未嘗試調試它。我會嘗試。該網絡是[立方體](http://img861.imageshack.us/img861/2667/networkcube.jpg)。我嘗試檢查此網絡是否與此代碼連接。該算法檢查第一個節點(u = 0)。 ScanQ是掃描的節點,onScanQ是下一個掃描節點。輸出給出第一個節點u = 0,句子中沒有句子及其鄰居節點! – John 2011-12-24 13:58:25

回答

1

在while循環內部快速顯示while中的條件不等於true,因此僅打印一組輸出!

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

輸出:

Qsize=4 k=10 
+0

謝謝!計數器k的位置是錯誤的。正確的位置在for循環之後。 – John 2011-12-24 14:04:09

+0

如果您使用了for(k = 0; k wildplasser 2011-12-24 14:12:00