单源最短路径贪心算法用c++写一份
时间: 2024-05-09 09:15:56 浏览: 12
下面是单源最短路径贪心算法的C++实现,使用了Dijkstra算法:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
typedef pair<int, int> P;
vector<P> G[1001];
int d[1001];
void dijkstra(int s) {
memset(d, INF, sizeof(d));
d[s] = 0;
priority_queue<P, vector<P>, greater<P>> que;
que.push(P(0, s));
while(!que.empty()) {
P p = que.top(); que.pop();
int v = p.second;
if(d[v] < p.first) continue;
for(int i = 0; i < G[v].size(); i++) {
int u = G[v][i].first, w = G[v][i].second;
if(d[u] > d[v] + w) {
d[u] = d[v] + w;
que.push(P(d[u], u));
}
}
}
}
int main() {
int n, m, s;
cin >> n >> m >> s;
for(int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c;
G[a].push_back(P(b, c));
}
dijkstra(s);
for(int i = 1; i <= n; i++) {
if(d[i] == INF) cout << "INF" << endl;
else cout << d[i] << endl;
}
return 0;
}
```
其中,`G`是邻接表,`d`是存储最短路径的数组。在`dijkstra`函数中,首先将所有节点到源点的距离初始化为INF,将源点加入最小堆中。然后重复以下步骤:从最小堆中取出距离源点最近的节点,如果该节点已经更新过最短路径,跳过;否则,将该节点的相邻节点更新到最小堆中。最后,遍历所有节点,输出到源点的最短路径。