Dijkstra(单源最短路算法)

typedef struct gra{            //顶点
  int val;
  int weight;
}graph;
graph g[1005][1005],dist[1005];    //图  和  最短路径
int visit[1005];             //顶点是否已被访问

void dijkstra(int start,int n){
  int min,u;
  for(int i=1;i<=n;i++){       //初始化最短路径数组 和 访问数组
    dist[i].val = MAXVAL;
    visit[i]=0;
  }
  for(int i=1;i<=n;i++){       //计算源点到各顶点的最短路径
    if(g[start][i].val < MAXVAL){ 
      dist[i].val = g[start][i].val;
      dist[i].weight = g[start][i].weight;
    }
  }
  visit[start] = 1;          //设置源点已被访问
  dist[start].val = 0;         //源点到源点的距离为0

  for(int i=1;i<=n;i++){      //计算n轮后最短路径
    min = MAXVAL;
    u = 0;            
     for(int k=1;k<=n;k++){           //找出每一轮新的最短路径的顶点
      if(visit[k]==0 && dist[k].val < min){
        min = dist[k].val;
        u = k;            //设置该顶点为新的起点
      }
    }
    visit[u] = 1;             //设置该顶点已被访问
    for(int j=1;j<=n;j++){        //以新顶点为起点,更新最短路径
      if(visit[j]==0 && dist[j].val > (dist[u].val + g[u][j].val)){//如果 源点到新起点的距离 加上 新起点到各点的距离,比 源点 到 各点 的距离短,更新最短路径
        dist[j].val = dist[u].val + g[u][j].val;
        dist[j].weight = dist[u].weight + g[u][j].weight;
      }else if(visit[j]==0 && dist[j].val == (dist[u].val + g[u][j].val)){//如果距离相等,则选择花费较小的路径作为最短距离
        if(dist[j].weight > (dist[u].weight + g[u][j].weight)){
          dist[j].weight = dist[u].weight + g[u][j].weight;
        }
      }
    }
  }
}

转载于:https://www.cnblogs.com/ruowei/p/5995160.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值