加载中...

核心代码

多源最短路径

Floyd—Warshall

    //k为开通的中转站,
    //如果由k站中转得到的路程比原路程少则更改最短路程
    for(k=1;k<=n;k++)
        for(i=1;i<=n;i++)
            for(e[i][j]>e[i][k]+e[k][j])
                e[i][j] = e[i][k]+e[k][j];

// for(e[i][k]<inf && e[k][j]<inf && e[i][j]>e[i][k]+e[k][j])

单源最短路径

Dijkstra算法———通过边实现松弛

void f()
{
    for(i=1;i<=n-1;j++)//从节点1开始,n-1次将最近点的估计值变成确定值
    {
        //找到离1号顶点最近的顶点
        min=inf;
        for(j=1;j<=n;j++)
        {
            //未有确定值且值小于已知最小
            if(book[j]==0 && dis[j]<min)
            {
                min=dis[j];
                u=j;
            }
        }
        
        //找到离节点1最近的点,到该点的最短路程又估计值变为确定值
        //标记,说明已经找到从i点到u点的最短距离
        book[u]=1;
        for(v=1;v<=n;v++)
        {
            if(e[u][v]<inf)//u到v有路可走
            {
                //若直接从i点到v点的距离>从i点到u点再从u点到v的距离
                //则更改最小值
                if(dis[v]>dis[u]+e[u][v])
                    dis[v]=dis[u]+e[u][v];
            }
        }
    }
    
}
posted @ 2022-09-24 11:10  biubidio  阅读(165)  评论(0)    收藏  举报