Day11:图的搜索算法C语言实现
深度优先DFS和广度优先BFS搜素算法的C语言实现
·
以Day9的邻接矩阵为例
1. 深度优先搜索(DFS)
void DFSTraverse(MatrixGraph *mg) // DFS启动算法
{
int *visited = malloc(sizeof(int) * mg->vexNum);
memset(visited, 0, sizeof(int) * mg->vexNum);
for(int i = 0;i < mg->vexNum;i++)
if(visited[i] == 0)
DFS(mg, i, visited);
putchar('\n');
}
void DFS(MatrixGraph *mg, int v, int visited[]) // DFS局部搜索
{
printf("%d ", v);
visited[v] = 1;
// 遍历u的每一个邻接点
for(int w = MatrixGraphLocateVex(mg, MatrixGraphFirstAdjVex(mg, mg->vexs[v]));w >= 0;w = MatrixGraphLocateVex(mg, MatrixGraphNextAdjVex(mg, mg->vexs[v], mg->vexs[w]))) {
if(visited[w] == 0)
DFS(mg, w, visited);
}
}
2. 广度优先搜索(BFS)
void BFSTraverse(MatrixGraph *mg) // BFS启动算法
{
int *visited = malloc(sizeof(int) * mg->vexNum);
memset(visited, 0, sizeof(int) * mg->vexNum);
for(int i = 0;i < mg->vexNum;i++)
if(visited[i] == 0)
BFS(mg, i, visited);
}
void BFS(MatrixGraph *mg, int v, int visited[]) // BFS局部搜索
{
LinkQueue *lq = malloc(sizeof(LinkQueue));
LinkQueueInit(lq);
printf("%d ", v); // 输出作为visit语句,也可替换为其它函数
visited[v] = 1;
LinkQueueEnQueue(lq, v);
while(LinkQueueEmpty(lq) < 0) {
int u = -1;
LinkQueueDeQueue(lq, &u);
// 遍历u的每一个邻接点
for(int w = MatrixGraphLocateVex(mg, MatrixGraphFirstAdjVex(mg, mg->vexs[u]));w >= 0;w = MatrixGraphLocateVex(mg, MatrixGraphNextAdjVex(mg, mg->vexs[u], mg->vexs[w]))) {
if(visited[w] == 0) {
visited[w] = 1;
printf("%d ", w);
LinkQueueEnQueue(lq, w);
}
}
}
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)