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

《数据结构与算法分析: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 }