图的点对最短路径算法(C++实现)

图的点对最短路径算法:运用了动态规划的思想

设图Gn 个顶点的编号为1n。令c (i, j, k)表示从i j 的最短路径的长度,其中k 表示该路径中的最大顶点。因此,如果G中包含边<i, j>,则c(i, j, 0) =<i, j> 的长度;若i= j ,则c(i,j, 0)=0;如果G中不包含边<i, j>,则c (i, j, 0)= +∞。c(i, j, n) 则是从i j 的最短路径的长度。

 

图的点对最短路径的动态规划递归方程:c( i, j, k)= m i n {c(i, j, k-1), c (i, k, k- 1) +c (k, j, k- 1 ) }k0

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是Dijkstra最短路径算法C++实现。假设我们有一个无向,节编号为0到n-1,的邻接矩阵为graph。 ```c++ #include <iostream> #include <vector> #include <queue> #include <limits.h> // for INT_MAX using namespace std; // Dijkstra最短路径算法 void Dijkstra(vector<vector<int>>& graph, int start) { int n = graph.size(); // 存储每个节最短路径 vector<int> dist(n, INT_MAX); // 起到起的距离为0 dist[start] = 0; // 存储已经处理过的节 vector<bool> visited(n, false); // 优先队列,按照距离排序 priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; // 把起加入队列 pq.push({0, start}); while (!pq.empty()) { // 取出队首节 int u = pq.top().second; pq.pop(); // 如果已经处理过,跳过 if (visited[u]) continue; // 标记为已处理 visited[u] = true; // 更新相邻节最短路径 for (int v = 0; v < n; ++v) { // 如果节v未处理过,且u到v有边 if (!visited[v] && graph[u][v]) { // 如果通过u到v的距离更短 if (dist[u] + graph[u][v] < dist[v]) { // 更新最短路径 dist[v] = dist[u] + graph[u][v]; // 把节加入队列 pq.push({dist[v], v}); } } } } // 输出最短路径 for (int i = 0; i < n; ++i) { cout << "Start " << start << " to " << i << " : " << dist[i] << endl; } } int main() { // 无向的邻接矩阵 vector<vector<int>> graph = { {0, 1, 4, 0, 0}, {1, 0, 2, 7, 0}, {4, 2, 0, 3, 5}, {0, 7, 3, 0, 2}, {0, 0, 5, 2, 0} }; Dijkstra(graph, 0); return 0; } ``` 这个算法的时间复杂度为O(nlogn),其中n为节数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值