请编写程序求给定正权有向图的单源最短路径长度。图中包含n个顶点,编号为0至n-1,以顶点0作为源点。
时间: 2023-04-21 18:05:29 浏览: 253
可以使用Dijkstra算法来求解给定正权有向图的单源最短路径长度。具体步骤如下:
1. 初始化距离数组dist,将源点的距离设为,其他点的距离设为无穷大。
2. 创建一个优先队列,将源点加入队列。
3. 当队列不为空时,取出队列中距离源点最近的点u。
4. 遍历点u的所有出边,对于每条出边(u,v),如果dist[u]+w(u,v)<dist[v],则更新dist[v]为dist[u]+w(u,v),并将点v加入队列。
5. 重复步骤3和步骤4,直到队列为空。
最终,dist数组中存储的就是源点到其他点的最短路径长度。
代码实现如下(假设图的邻接矩阵为adj,w(u,v)表示边(u,v)的权重):
```
#include <iostream>
#include <queue>
using namespace std;
const int MAXN = 100;
const int INF = x3f3f3f3f;
int adj[MAXN][MAXN]; // 邻接矩阵
int dist[MAXN]; // 最短路径长度
bool vis[MAXN]; // 是否已经访问过
void dijkstra(int n) {
// 初始化
for (int i = ; i < n; i++) {
dist[i] = INF;
vis[i] = false;
}
dist[] = ;
// 创建优先队列
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
pq.push(make_pair(, ));
while (!pq.empty()) {
int u = pq.top().second;
pq.pop();
if (vis[u]) continue;
vis[u] = true;
for (int v = ; v < n; v++) {
if (adj[u][v] != INF && dist[u] + adj[u][v] < dist[v]) {
dist[v] = dist[u] + adj[u][v];
pq.push(make_pair(dist[v], v));
}
}
}
}
int main() {
int n;
cin >> n;
// 输入邻接矩阵
for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
cin >> adj[i][j];
if (adj[i][j] == -1) adj[i][j] = INF;
}
}
dijkstra(n);
// 输出最短路径长度
for (int i = ; i < n; i++) {
cout << dist[i] << " ";
}
cout << endl;
return ;
}
```
阅读全文