百科—最短路

最短路问题 编辑词条

最短路问题(short-path problem):若网络中的每条边都有一个数值(长度、成本、时间等),则找出两节点(通常是源节点和阱节点)之间总权和最小的路径就是最短路问题。最短路问题是网络理论解决的典型问题之一,可用来解决管路铺设、线路安装、厂区布局和设备更新等实际问题。

基本信息

  • 中文名称

    最短路问题

  • 外文名称

    short-path problem

 
  • 解决算法

    Floyd-Warshall算法

  • 实现方式

    广度优先搜索、深度优先搜索

折叠编辑本段单源最短路径

包括确定起点的最短路径问题,确定终点的最短路径问题(与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。) 。求解单源最短路径问题可以采用Dijkstra算法,时间复杂度为O(|V|^2)。Dijkstra算法可以使用斐波那契堆、配对堆等支持Decrease-Key操作的数据结构来进一步优化,优化后的时间复杂度为O(|E|+|V|log|V|)。

折叠编辑本段全局最短路径

求图中所有的最短路径可以采用Floyd-Warshall算法,算法时间复杂度为O(|V|^3)。如果图中有负权回路,可以采用Bellman-Ford算法,算法复杂度是O(|V||E|)。但Bellman-ford算法浪费了许多时间做无必要的松弛,可用SPFA算法进行优化,SPFA算法是用队列进行的优化,优化后时间复杂度为O(k|E|), 其中k为所有顶点进队的平均次数,可以证明k一般小于等于2,由此可见该优化的效果十分显著。

折叠编辑本段两点最短路径

即已知起点和终点,求两结点之间的最短路径。通常可以用广度优先搜索(BFS)、深度优先搜索(DFS)等方式来实现,时间复杂度是O(|V|)。


挑战程序设计竞赛dijk..代码:
int cost[max][max];//cost[u][v] 表示边e=(u,v)的权值
int d[max];//顶点s出发的最短距离
int used[max];//已经使用过的图
int v;//顶点数
void dijkstra(int s)
{
    fill (d,d+v,INT);
    fill (used,used+v,0);
    d[s]=0;
    while(1)
    {
        int v=-1;//从尚未使用过的顶点中选择一个距离最小的顶点
        for(int u=0;u<v;u++)
        {
            if(!used[u]&&(v==-1||d[u]<d[v]))
                v=u;
        }
        if(v=-1)
        {
            break;
        }
        for(int u=0;u<v;u++)
        {
            d[u]=min (d[u],d[v]+cost[v][u]);
        }
    }
}
》》
学长模板:
void dijkstra (int u);
{
    memset(used,0,sizeof(used));
    memset(dis,INT,sizeof(dis));
    int pos=u;
    for(int i=0;i<n;i++)
    {
        dis[i]=map[u][i];
    }
    dis[u]=0;
    used[u]=1;
    for(int i=1;i<n;i++)
    {
        int min=INF;
        for(int j=0;j<n;j++)
        {
            if(!used[j]&&dis[j]<min)
            {
                min=dis[j];
                pos=j;
            }
        }
        used[pos]=1;
        dis[pos]=min;
        for(int j=0;j<n;j++)
        {
            if(!used[j]&&dis[j]>map[pos][j]+dis[pos])
            {
                dis[j]=map[pos][j]+dis[pos];
            }
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值