zoukankan      html  css  js  c++  java
  • 《数据结构与算法分析:C语言描述》复习——第九章“图论”——单源带权最短路径问题

    2014.07.04 18:32

    简介:

      给定一个有向图,边的权值可能各不相同(不包含负权值)。给定一个起点s,找出起点到所有顶点的最短路径距离。

    描述:

      这就是Dijkstra算法的用武之处了。

      实际上,如果从无权值的情况出发,来思考带权最短路径问题的解法,那么应该只需要修改几行之前BFS的代码就能解决问题。

      对于无权值的情况,每条边的长度都是1,那么先搜到的路径必然也是最短的。当边的长度各不相同时,后搜到的路径也可能更短,因此加上对应的判断和更新代码即可。

    实现:

     1 // A simple illustration for weighted shortest path. Graph represented by adjacency matrix.
     2 #include <iostream>
     3 #include <queue>
     4 #include <vector>
     5 using namespace std;
     6 
     7 const int INFINITY = 1000000000;
     8 
     9 void weightedShortestPath(const vector<vector<int> > &graph, 
    10     vector<int> &dist, vector<bool> &reachable)
    11 {
    12     // The minimal distances from 0th vertice to others.
    13     int n;
    14     int i, j;
    15     
    16     n = (int)graph.size();
    17     dist.resize(n);
    18     reachable.resize(n);
    19 
    20     if (n < 1) {
    21         return;
    22     }
    23     
    24     for (i = 0; i < n; ++i) {
    25         reachable[i] = false;
    26     }
    27     
    28     queue<int> q;
    29     
    30     dist[0] = 0;
    31     reachable[0] = true;
    32     
    33     q.push(0);
    34     while (!q.empty()) {
    35         i = q.front();
    36         q.pop();
    37         for (j = 0; j < n; ++j) {
    38             if (graph[i][j] == INFINITY || (reachable[j] && 
    39                 dist[i] + graph[i][j] >= dist[j])) {
    40                 continue;
    41             }
    42             dist[j] = dist[i] + graph[i][j];
    43             if (!reachable[j]) {
    44                 q.push(j);
    45             }
    46             reachable[j] = true;
    47         }
    48     }
    49 }
    50 
    51 int main()
    52 {
    53     vector<vector<int> > graph;
    54     vector<int> dist;
    55     vector<bool> reachable;
    56     int n;
    57     int nk;
    58     int i, j;
    59     int tmp, tmp_dist;
    60     
    61     while (cin >> n && n > 0) {
    62         graph.resize(n);
    63         for (i = 0; i < n; ++i) {
    64             graph[i].resize(n, INFINITY);
    65         }
    66         
    67         for (i = 0; i < n; ++i) {
    68             cin >> nk;
    69             for (j = 0; j < nk; ++j) {
    70                 cin >> tmp >> tmp_dist;
    71                 graph[i][tmp] = tmp_dist;
    72             }
    73         }
    74         
    75         weightedShortestPath(graph, dist, reachable);
    76         
    77         for (i = 0; i < n; ++i) {
    78             cout << i << ": ";
    79             if (reachable[i]) {
    80                 cout << dist[i] << endl;
    81             } else {
    82                 cout << "Unreachable" << endl;
    83             }
    84         }
    85         
    86         for (i = 0; i < n; ++i) {
    87             graph[i].clear();
    88         }
    89         graph.clear();
    90     }
    91     
    92     return 0;
    93 }
  • 相关阅读:
    2. Git基础命令
    1.Git基础配置
    demo_49 大结局
    demo_48 上传图片实现
    demo_47 反馈图片选择功能实现
    demo_46 问题反馈页面实现
    gitlab +jenkins
    面试分析
    面试基础 一文件操作和程序进程
    man 命令帮助文档的使用
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3824953.html
Copyright © 2011-2022 走看看