C 广度优先搜索-错误结果

C 广度优先搜索-错误结果,c,path,short,C,Path,Short,这段代码实现了广度优先搜索 #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

这段代码实现了广度优先搜索

#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");}
#定义n9//节点
#定义maxnum65555
#定义FALSE 0
#定义真1
int main(){
int i,j;
int网络[N][N];//邻接矩阵
int dist[N];//到节点u的距离
int u=0;//选择第一个节点
无效bfs(int,int[N][N],int[N]);
对于(i=0;i}while(kwhile循环中的快速
printf
显示您在
while
中的状态不等于
true
,因此只打印一组输出

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

while循环中的快速
printf
显示
while
中的条件不等于
true
,因此只打印一组输出

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

当您在调试器中逐步执行代码时,您发现了什么?请您解释一下您的内部数据结构(如ScanQ,onScanQ);计数器/索引(如v,w);您的输出格式“0(1)(3)(5)”是什么意思?-主要是您的算法!。OTOH您是否尝试过调试此代码?请分享您的经验!我是C语言新手,没有尝试过调试它。我会尝试。网络是a。我尝试检查此网络是否与此代码连接。算法检查第一个节点(u=0).ScanQ是扫描的节点,onScanQ是下一个扫描的节点。输出给出第一个节点u=0,没有句子和句子中的相邻节点!当您在调试器中遍历代码时,您发现了什么?请解释一下您的内部数据结构,如ScanQ,onScanQ;计数器/索引,如v,w;您的o输出格式-这是什么意思“0(1)(3)(5)”?-主要是您的算法!。您是否尝试调试此格式?请分享您的经验!我是C语言新手,没有尝试调试它。我会尝试。网络是a。我尝试检查此网络是否与此代码连接。算法检查第一个节点(u=0).ScanQ是扫描节点,onScanQ是下一个扫描节点。输出给出第一个节点u=0,没有句子,句子中有它的相邻节点!谢谢!计数器k的位置是错误的。正确的位置在for循环之后。如果使用了for(k=0;k,则可以避免错误的位置{}
loop而不是
do{…}while(…);
loop。这也会使数组从0开始,这更自然。谢谢!错误的是计数器k的位置。正确的位置在for循环之后。如果您使用
for(k=0;k
loop而不是
do{…}while(…);
loop。这也会使数组从0开始,这更自然。