Dijktra算法C语言实现

  1. void Dijkstra_c(int out[], int N, int v0){  
  2.     int i, j;  
  3.     int visited[maxN] = { 0 }; // 表示顶点是否被选中,0:顶点未被选中;1:顶点已被选中  
  4.     int last_visited = 0;  
  5.     for (i = 0; i < N; ++i){  
  6.         out[i] = INF; // 把输出结果全部初始化为无穷大  
  7.     }  
  8.     visited[v0] = 1; // 选中起始顶点  
  9.     out[v0] = 0;  
  10.   
  11.     for (i = 0; i < N - 1; ++i) { // N 个顶点需要做 N - 1 次循环  
  12.         // 查看顶点周围的所有点  
  13.         for (j = 0; j < N; ++j) { // 循环遍历所有顶点  
  14.             if (visited[j] == 0) { // 保证被查看的新顶点没有被访问到  
  15.                 if (matrix[v0][j] != 0){ // 保证当前顶点(V0)与新顶点(j)之间有路径  
  16.                     int dist = matrix[v0][j] + last_visited; // 计算 V0 到 J 的路径距离  
  17.                     if (dist < out[j])out[j] = dist; // 用新路径代替原来的路径  
  18.                 }  
  19.             }  
  20.         }  
  21.         // 找出最小值  
  22.         int minIndex = 0;  
  23.         while (visited[minIndex] == 1) minIndex++; // 找第一个没有被选中的节点  
  24.         for (j = minIndex; j < N; ++j) {  
  25.             if (visited[j] == 0 && out[j] < out[minIndex]){  
  26.                 minIndex = j;  
  27.             }  
  28.         }  
  29.   
  30.         last_visited = out[minIndex]; // 更新最小值  
  31.         visited[minIndex] = 1; // 将最小值顶点选中  
  32.         v0 = minIndex; // 下次查找从最限制顶点开始  
  33.     }  
  34. }  
  35.   
  36. int _tmain(int argc, _TCHAR* argv[])  
  37. {  
  38. #if 0  
  39.     freopen("Dijkstra2Data.txt""r", stdin);  
  40.     int result[maxN];  
  41.     int N, i, j;  
  42.     scanf("%d", &N);  
  43.     for (i = 0; i < N; ++i){  
  44.         for (j = 0; j < N; ++j){  
  45.             scanf("%d", &matrix[i][j]);  
  46.         }  
  47.     }  
  48.   
  49.     Dijkstra_c(result, N, 0);  
  50.   
  51.     for (i = 0; i < N; ++i){  
  52.         if (result[i] == INF)printf("INF\n");  
  53.         else printf("%d\n", result[i]);  
  54.     }  
  55. #endif  
  56.   
  57.     freopen("Dijkstra2Data.txt""r", stdin);  
  58.     int n;  
  59.     scanf("%d", &n);  
  60.     vector<vector<int>> vec(n, vector<int>(n, 0));  
  61.     for (int i = 0; i < n; ++i){  
  62.         for (int j = 0; j < n; ++j){  
  63.             cin >> vec[i][j];  
  64.         }  
  65.     }  
  66.   
  67.     vector<int> result(n, INF); // 把输出结果全部初始化为无穷大  
  68.     Dijkstra_cpp(vec,result, 0);  
  69.   
  70.     for (int i = 0; i < n; ++i){  
  71.         if (result[i] == INF)printf("INF\n");  
  72.         else printf("%d\n", result[i]);  
  73.     }  
  74.     return 0;  
  75. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值