解题思路:
        首先要开一个二维数组储存邻接矩阵,一般的方法是开一个足够大的数组,例如这道题是n不大于50,不过这样做会造成空间不必要的浪费。因此手动分配空间会更为合理。一种方法是用malloc,对应销毁空间的函数是free,这种方法适用于C语言和c++。另一种方法是用new,对应销毁空间的方法是delete,注意malloc对应的是free,new对应的是delete,不能搞混。

        主要介绍一下malloc,一维数组开辟空间只需要,int* temp=(int*)malloc(n*sizeof(int))就可以开辟n长度的数组。二维及以上要多几步。例如这道题用于储存邻接矩阵的数组的开辟方法:

int** map=(int**)malloc(vertexNum*sizeof(int));

for(int i=0;i<vertexNum;i++)

map[i]=(int*)malloc(vertexNum*sizeof(int)); 

        第二步是广度优先搜索,需要一个队列和一个判断是否被访问过的bool类型的数组visited,队列每出一个点temp,就遍历temp的邻接点,没有访问过就入队,直到队列为空时就可以停止了。


参考代码:

#include<cstdio>

#include<queue>

#include<malloc.h>

using std::queue;


void initialize(int vertexNum,int** &map){

    map=(int**)malloc(vertexNum*sizeof(int));

    for(int i=0;i<vertexNum;i++)

        map[i]=(int*)malloc(vertexNum*sizeof(int)); 

    for(int i=0;i<vertexNum;i++)

        for(int j=0;j<vertexNum;j++)

            scanf("%d",&map[i][j]);

}

void BFS(int vertexNum,int** map){

    queue<int> Q;

    bool* visited=(bool*)malloc(vertexNum*sizeof(bool));

    for(int i=1;i<vertexNum;i++)

        visited[i]=false;

    visited[0]=true;

    Q.push(0);

    while(!Q.empty()){

        int temp=Q.front();

        printf("%d ",temp);

        Q.pop();

        for(int i=0;i<vertexNum;i++){

            if(map[temp][i]!=0&&visited[i]==false){

            Q.push(i);

            visited[i]=true;

        }

    }

}

}

int main(){

    int** map=NULL;

    int vertexNum;

    scanf("%d",&vertexNum);

    initialize(vertexNum,map);

    BFS(vertexNum,map);

    return 0;

}


点赞(1)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论