数据结构领接矩阵编写一个程序exp8-16.cpp,用来求解最短路径问题,假设有n个点,m条无向边,每条边都有长度d和花费p,点的编号是1到n
时间: 2023-10-26 19:04:41 浏览: 46
以下是exp8-16.cpp的代码:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int INF = 0x3f3f3f3f;
struct Edge {
int to, d, p;
Edge(int to, int d, int p): to(to), d(d), p(p) {}
};
vector<Edge> edges[105];
int n, m, s, t;
int d[105], p[105]; // d[i]表示从起点s到i的最短距离,p[i]表示从起点s到i的最小花费
bool vis[105];
void dijkstra() {
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; // 小根堆
pq.push(make_pair(0, s));
memset(d, INF, sizeof(d));
memset(p, INF, sizeof(p));
memset(vis, false, sizeof(vis));
d[s] = p[s] = 0;
while (!pq.empty()) {
pair<int, int> u = pq.top();
pq.pop();
if (vis[u.second]) continue;
vis[u.second] = true;
for (int i = 0; i < edges[u.second].size(); i++) {
int v = edges[u.second][i].to;
int w = edges[u.second][i].d;
int c = edges[u.second][i].p;
if (d[v] > d[u.second] + w || (d[v] == d[u.second] + w && p[v] > p[u.second] + c)) {
d[v] = d[u.second] + w;
p[v] = p[u.second] + c;
pq.push(make_pair(d[v], v));
}
}
}
}
int main() {
cin >> n >> m >> s >> t;
for (int i = 1; i <= m; i++) {
int u, v, w, c;
cin >> u >> v >> w >> c;
edges[u].push_back(Edge(v, w, c));
edges[v].push_back(Edge(u, w, c)); // 无向图
}
dijkstra();
cout << d[t] << " " << p[t] << endl;
return 0;
}
```
程序中使用了Dijkstra算法来解决最短路径问题。在每次更新最短距离和最小花费时,需要判断两个条件,分别是距离和花费是否更小。如果距离更小,那么花费就没有必要继续判断了;如果距离相等,才需要比较花费。这是因为在求最短路径时,距离更重要,而花费仅是次要的因素。
程序输入格式为:
```
n m s t
u1 v1 w1 c1
u2 v2 w2 c2
...
um vm wm cm
```
其中,n表示点的数量,m表示边的数量,s表示起点,t表示终点,ui、vi、wi、ci分别表示第i条边的两个端点、长度和花费。
程序输出格式为:
```
最短距离 最小花费
```
例如,对于以下数据:
```
5 7 1 5
1 2 2 3
1 4 5 1
2 3 3 1
2 4 3 2
3 5 1 2
4 3 1 1
4 5 2 2
```
程序的输出为:
```
8 6
```
表示起点1到终点5的最短距离为8,最小花费为6。