最短路径

本文介绍单源最短路径算法,包括有向无权图的处理方法及有向有权图的Dijkstra算法,并探讨多源最短路径问题的解决策略,如Floyd算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、单源最短:

1.有向无权图:

//伪代码
/*
    dist[w]:w到s最短距离,path[w]:w到s的前一个顶点,
    T = O(V+E)
*/
void Unweighted(Vertex S)
{
    Enqueue(S, Q);
    while(!IsEmpty (Q))
    {
        V =Dequeue(Q);
        for(V 的每个邻接点 W)
        if (dist[W]==-1)
        {
            dist[W] = dist[V]+1;
            path[W] = V;
            Enqueue(W, Q);
        }
    }
}

2.有向有权图:

/*
Dijkstra算法:
    令S={源点s + 已经确定了最短路径的顶点vi}
    对任一未收录的顶点v,定义dist[v]为s到v的最短路径长度,但该路径仅经过
    S中的顶点。
*/

/*
    直接扫描dist[v]:T=O(V^2 + E)
    dist[v]放进最小堆:T=O(ElogV)
*/

void Dijkstra(Vertex s)
{
    while(1)
    {
        V = 未收录顶点中dist最小者;
        if(这样的V不存在)
            break;
        collected[V] = true;
        for(V 的每个邻接点W)
        {
            if ( collected[W] == false )
            {
                if ( dist[V]+E<V,W> < dist[W])
                {
                    dist[W] = dist[V] + E<V,W>;
                    path[W] = V;
                }
            }
        }
    }
}

二、多源最短

//法一:直接单源调用V遍 T=O(V^3 + E*V)

//法二:Floyd算法: T=O(V^3)
void Floyd()
{
    for(i = 0; i < N; i++)
    {
        for(j = 0; j < N; j++)
        {
            D[i][j] = G[i][j];
            path[i][j] = -1; 
        }
    }
    for( k = 0; k < N; k++ )
    {
        for(i = 0; i < N; i++)
        {
            for(j = 0; j < N; j++)
            {
                if( D[i][k] + D[k][j] < D[i][j])
                {
                    D[i][j] = D[i][k] + D[k][j];
                    path[i][j] = k;
                }
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值