图论(二)--广度优先搜索(BFS)

基于算法导论图算法-广度优先搜索

  • 题目描述
  • 问题分析
  • 源代码
  • 结果截图

题目描述

使用广度优先搜索遍历图:
输入:图G和源顶点s
输出:从s到所有顶点的最短距离

问题分析

广搜的思想类似水滴的扩散,在此不再赘述。

本例中一开始所有节点为白色,进队列后变为灰色,出队列后变为黑色。

伪代码

这里写图片描述

这里写图片描述

源代码

以下代码基于图论(一)–图的建立中代码创建的图G进行编写

void BFS(Graph G, Vertex s);//广度优先搜索
void print_path_twoPoint(Graph G, Vertex s, Vertex v);//打印两点路径
void print_dist(Graph G, Vertex s);//打印各顶点到顶点s的距离和路径

图的点结构需要变化

struct VertexRecord {
    Vertex pred;//先驱结点
    int in_degree;//入度 
    int out_degree;//出度 
    int color;//顶点状态
    int dist;//距离源点的距离
    List  adjto;//指向第一个邻接结点的指针
};
#include<queue>

void print_path_twoPoint(Graph G,Vertex s, Vertex v) {

    if (v == s) {
        printf(" %d",s);
    }else if(G->vertices[v].pred == -1){
        printf("无相应路径");
    }
    else {
        print_path_twoPoint(G, s, G->vertices[v].pred);
        printf(" %d", v);
    }

}

void print_dist(Graph G , Vertex s) {//打印各顶点到顶点s的距离和路径
    for (int i = 0; i < G->vexnum; i++) {
        printf("顶点%d与%d的距离:%d,路径为:", s, i, G->vertices[i].dist);
        print_path_twoPoint(G, s, i);
        printf("\n");
    }
}

void BFS(Graph G, Vertex s) {

    Vertex u, v;
    PtrToNode ptr;
    for (int i = 0; i < G->vexnum; i++) {
        G->vertices[i].color = 0;//白色,表示未搜索
        G->vertices[i].dist = INF;
        G->vertices[i].pred = -1;
    }
    G->vertices[s].color = 1;//灰色,在队列里
    G->vertices[s].dist = 0;
    G->vertices[s].pred = -1;
    queue<Vertex> Q;
    Q.push(s);
    //int count = 0;

    while (!Q.empty()) {
        u = Q.front();
        Q.pop();
        ptr = G->vertices[u].adjto;
        while (ptr != NULL) {
            v = ptr->adjvex;
            if (G->vertices[v].color == 0) {
                G->vertices[v].color = 1;
                G->vertices[v].dist = G->vertices[u].dist + 1;//权为1计算
                G->vertices[v].pred = u;
                Q.push(v);
            }
            ptr = ptr->next;
        }
        G->vertices[u].color = 2;//黑色 
        printf("%d ", u);

    }

    printf("\n");
    print_dist(G, s);

}

int main() {
    //有向图的随机生成(20个顶点,100左右的边,可以进行修改)
    //CreateRandomDirectGraph();
    //Graph G = CreateDirectGraph();

    //无向边的随机生成(20个顶点,50左右的边)
    CreateRandomUndirectGraph();
    Graph G = CreateUndirectGraph();
    printf("打印图结构:\n"); 
    print_graph(G);//打印图
    //printf("\n打印各顶点入度和出度:\n");
    //print_VertexDegree(G);//打印顶点度数
    //printf("\n打印每条边的权值:\n");
    //print_EdgeWeight(G);//打印边权

    printf("\n下面是bfs:\n");
    BFS(G, 0);
    return 0;   
} 

结果截图
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值