• 《数据结构与算法分析:C语言描述》复习——第九章“图论”——无权值的最短路径问题


    2014.07.04 18:24

    简介:

      给定一个有向图,你可以认为每条边长度都是1(所以叫无权值)。下面的算法可以求出从特定的起点到终点的最短路径长度。

    描述:

      从起点出发,根据当前顶点出发的边进行广度优先搜索,直至找到终点即可。如果搜索结束了仍然没有找到终点,那么起点无法到达终点。

    实现:

     1 // A simple illustration for unweighted shortest path. Graph represented by adjacency matrix.
     2 #include <iostream>
     3 #include <queue>
     4 #include <vector>
     5 using namespace std;
     6 
     7 void unweightedShortestPath(const vector<vector<bool> > &graph, 
     8     vector<int> &dist, vector<bool> &reachable)
     9 {
    10     // The minimal distances from 0th vertex to others.
    11     int n;
    12     int i, j;
    13     
    14     n = (int)graph.size();
    15     dist.resize(n);
    16     reachable.resize(n);
    17 
    18     if (n < 1) {
    19         return;
    20     }
    21     
    22     for (i = 0; i < n; ++i) {
    23         reachable[i] = false;
    24     }
    25     
    26     queue<int> q;
    27     
    28     dist[0] = 0;
    29     reachable[0] = true;
    30     
    31     q.push(0);
    32     while (!q.empty()) {
    33         i = q.front();
    34         q.pop();
    35         for (j = 0; j < n; ++j) {
    36             if (!graph[i][j] || reachable[j]) {
    37                 continue;
    38             }
    39             dist[j] = dist[i] + 1;
    40             reachable[j] = true;
    41             q.push(j);
    42         }
    43     }
    44 }
    45 
    46 int main()
    47 {
    48     vector<vector<bool> > graph;
    49     vector<int> dist;
    50     vector<bool> reachable;
    51     int n;
    52     int nk;
    53     int i, j;
    54     int tmp;
    55     
    56     while (cin >> n && n > 0) {
    57         graph.resize(n);
    58         for (i = 0; i < n; ++i) {
    59             graph[i].resize(n, false);
    60         }
    61         
    62         for (i = 0; i < n; ++i) {
    63             cin >> nk;
    64             for (j = 0; j < nk; ++j) {
    65                 cin >> tmp;
    66                 graph[i][tmp] = true;
    67             }
    68         }
    69         
    70         unweightedShortestPath(graph, dist, reachable);
    71         
    72         for (i = 0; i < n; ++i) {
    73             cout << i << ": ";
    74             if (reachable[i]) {
    75                 cout << dist[i] << endl;
    76             } else {
    77                 cout << "Unreachable" << endl;
    78             }
    79         }
    80         
    81         for (i = 0; i < n; ++i) {
    82             graph[i].clear();
    83         }
    84         graph.clear();
    85     }
    86     
    87     return 0;
    88 }
  • 相关阅读:
    log4net使用封装,无缝切换 dotnet 和 dotnetcore
    使用 certbot 申请泛域名https证书
    StackExchange.Redis中文使用文档
    在 asp.net core 中使用类似 Application 的服务
    不一样的 SQL Server 日期格式化
    你可能不知道的 docker 命令的奇淫怪巧
    [k8s]dashboard1.8.1搭建( heapster1.5+influxdb+grafana)
    [k8s]k8s 1.9(on the fly搭建) 1.9_cni-flannel部署排错 ipvs模式
    [k8s] kubelet单组件启动静态pod
    [svc]runinit管理多进程
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3824943.html
Copyright © 2020-2023  润新知