Dijkstra算法求解单源最短路径

Dijkstra 算法
给定连通图 V ,将其分为两部分 S T=V-S, 引入数组 D[N], 其中 D[ i ] 表示从源点顶点 i 的最短距离。
1. 将源点 v0 加入到 S 中,并更新数组 D
2. 在数组 D 中找到最小值 D[u] 对应的顶点 u ,将 u T 中移到 S
3. 通过 u 作为中间点,比较 D[ i ] D[u]+( ui 的权值 ) ,更新 D[ i ]
4. 重复以上操作 2 3 ,直至 S=V ,即 S 包含所有顶点
 
 

#include <iostream>
#include <string.h>

using namespace std;

const int MAX_COST = 10000000;
const int MAX_NUM = 100;
int cost[MAX_NUM][MAX_NUM];
int D[MAX_NUM]; /* 保存源点到其余各个顶点的最短路径值 */
bool S[MAX_NUM]; /* 判断是否已经存入点到集合中*/

void Dijkstra(int v0, int N) /* v0: 源点cost: 邻接矩阵N: 顶点个数 */
{
 for(int i = 0; i < N; ++i) {
  D[i] = cost[v0][i];
  S[i] = false; /* 初始化数组S中没有顶点*/
 }

 D[v0] = 0;
 S[v0] = true;
 for (int i = 0; i < N; i++) {
  int minCost = MAX_COST;
  int u = v0;
  /* 找出当前未使用的点j的D[j]的最小值 */
  for (int j = 0; j < N; ++j) {
   if (!S[j] && D[j] < minCost) {
    u = j;
    minCost = D[j];
   }
  }

  S[u] = true; /* 将最小值对应的u加入到顶点集S中*/

  for (int j = 0; j < N; ++j) {
   if (!S[j] && cost[u][j] < MAX_COST && D[u] + cost[u][j] < D[j]) {
    /* 通过新加入的u点路径找到离源点v0更短的路径*/
    D[j] = D[u] + cost[u][j];
   }
  }
 }
}

int main()
{
 memset(S, 0, sizeof(S));
 memset(D, 0, sizeof(D));
 memset(cost, 0, sizeof(cost));

 int N; /* 顶点数*/
 int E; /*边数*/
 cin >> N;
 cin >> E;
 for (int i = 0; i < E; ++i) {
  int v1, v2;
  cin >> v1;
  cin >> v2;
  cin >> cost[v1][v2];
 }

 for (int i = 0; i < N; i++) {
  for (int j = 0; j < N; j++) {
   if (cost[i][j] == 0)
    cost[i][j] = MAX_COST;
  }
 }

 Dijkstra(0, N);

 for (int i = 0; i < N; ++i)
  cout << D[i] << endl;

 return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值