最短路径 dijkstra算法

算法功能:求出源点和所有点之间的最短路径

算法思想:每次选取未处理点中离源点最近的点,更新源点和所有点的距离(能到位值,不能到位无穷),然后置为已经处理过.

具体见代码:

//dijkstra算法模板
#define MAXV 100//后面都会用到
#define INF 32768//INF表示正无穷
struct MGraph
{
    double edges[MAXV][MAXV];//邻接矩阵的边数组
    int n;//顶点数,弧度;
};
MGraph g;
void Ppath(int path[],int i,int v)//输出i点和源点v之间的最短路径
{
    int k;
    k=path[i];
    if(k==v) return ;
    Ppath(path,k,v);
    cout<<k;
}
void Dispath(int dist[],int path[],int s[],int n,int v)//调用Ppath()输出源点和所有点之间的最短路径
{
    int i;
    for(i=0;i<n;i++)
       if(s[i]==1)
       {
           printf("从%d到%d的最短路径长度为%d\n",v,i,dist[i]);
           cout<<v;           //起点
           Ppath(path,i,v);   //中间点
           cout<<i<<endl;     //终点
       }
       else printf("从%d到%d不存在\n"v,i);
}
/*需要对g.edges[][]初始化,这个在主函数中读取数据时做
for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        {
            if(i!=j) g.edges[i][j]=INF;
            else g.edges[i][j]=0;
        }
*/
void Dijkstra(MGraph g,int v)//v为源点编号
{
    int dist[MAXV];//最短路径长度
    int path[MAXV];//保存在最短路径上的上一个点
    int s[MAXV];//标记:1表示有最短路径
    int mindis,i,j,u;
    for(i=0;i<g.n;i++)
    {
        dist[i]=g.edges[v][i];             //距离初始化
        s[i]=0;                            //s[]置空
        if(g.edges[v][i]<INF) path[i]=v;   //路径初始化
        else path[i]=-1;
    }
    s[v]=1; path[v]=0;
    for(i=0;i<g.n;i++)
    {
        mindis=INF;
        for(j=0;j<g.n;j++)                //选取不在s[]中且具有最小距离的顶点u
            if(s[j]==0)
              if(g.edges[u][j]<INF && dist[u]+g.edges[u][j]<dist[j])
              {
                  u=j;  mindis=dist[j];
              }
        s[u]=1;                           //将顶点u加入s[]中
        for(j=0;j<g.n;j++)                //修改不在s[]中顶点的距离
           if(s[j]==0)
              if(g.edges[u][j]<INF && dist[u]+g.edges[u][j]<dist[j])
              {
                  dist[j]=dist[u]+g.edges[u][j];
                  path[j]=u;
              }
    }
    dispath(dist,path,s,g.n,v);          //输出最短路径
}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daydaytech

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值