【C语言】利用BFS广度优先遍历求单源最短路径

         求结点u到其他结点的单源最短路径可以BFS广度优先遍历的方式,需要借助两个数组distance[]以及path[],前者记录到当前结点距离,后者表示路径的来源,当当前结点有未被访问的邻结点时,更新其相应的distance[]以及path[]数组即可。

void BFS_MIN_DISTANCE(Graph g,int u)
//利用BFS求u到各个结点的最短路径
{
    int distance[MAX_VERTEX_NUM];//记录最短路径距离数组
    int path[MAX_VERTEX_NUM];//记录路径来源数组
    int visited[MAX_VERTEX_NUM];//访问数组
    for(int i=0;i<g.vexnum;i++){//对数组进行初始化,-1代表到i无路径
        distance[i]=-1;
        path[i]=-1;
        visited[i]=0;
    }
    InitQueue(&Q);//创建并初始化队列
    visited[u]=1;//更改访问标志
    distance[u]=0;//更改距离数组,0表示该点是起点
    EnterQueue(&Q,u);
    while(!IsEmpty(Q)){//利用队列不断更新当前结点所有未被访问邻结点的数组信息
        DeleteQueue(&Q,&v);//队列非空,对头元素出队,并处理其所有未被访问邻结点
        int w=FirstAdjVertex(g,v);
        while(w!=-1){
            if(!visited[w]){//邻结点未被访问更新访问标志、路径信息和来源信息而后入队
                visited[w]=1;
                distance[w]=distance[v]+1;
                path[w]=v;
                EnterQueue(&Q,w);
            }
            w=NextAdjVertex(g,v,w);//更新邻结点
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值