请设计int distance(Graph g,VertexType v, VertexType u)函数。 该函数返回图中两个顶点v和w之间的距离(最短连通路上边的数目)。提示:连通返回距离,不连通返回0。
时间: 2024-02-09 20:10:25 浏览: 112
好的,以下是一个简单的实现:
```c++
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int INF = 0x3f3f3f3f; // 无穷大
typedef int VertexType; // 顶点类型
typedef int EdgeType; // 边权类型
// 图的邻接矩阵表示
struct Graph {
int n; // 顶点数
vector<vector<EdgeType>> edges; // 边权矩阵
Graph(int n) : n(n), edges(n, vector<EdgeType>(n, INF)) {}
void addEdge(int u, int v, EdgeType w) {
edges[u][v] = edges[v][u] = w;
}
};
// 最短路径算法
int distance(Graph g, VertexType v, VertexType u) {
vector<EdgeType> dist(g.n, INF); // v到各个点的距离
vector<bool> visited(g.n, false); // 是否访问过
priority_queue<pair<EdgeType, VertexType>> pq; // 小根堆,存储距离和顶点
pq.push({0, v}); // 起点v距离为0
dist[v] = 0; // 起点到自己的距离为0
while (!pq.empty()) {
VertexType cur = pq.top().second; // 取出距离最小的顶点
pq.pop();
if (visited[cur]) continue; // 已经访问过,跳过
visited[cur] = true;
for (VertexType i = 0; i < g.n; i++) { // 遍历所有邻居
if (g.edges[cur][i] != INF) { // cur和i有边
if (dist[i] > dist[cur] + g.edges[cur][i]) { // 更新距离
dist[i] = dist[cur] + g.edges[cur][i];
pq.push({-dist[i], i}); // 将新的距离和邻居加入堆中
}
}
}
}
return dist[u] == INF ? 0 : dist[u]; // 返回v到u的距离,若不连通,则返回0
}
// 测试
int main() {
Graph g(6);
g.addEdge(0, 1, 2);
g.addEdge(0, 2, 5);
g.addEdge(1, 2, 4);
g.addEdge(1, 3, 7);
g.addEdge(1, 4, 5);
g.addEdge(2, 4, 1);
g.addEdge(3, 4, 3);
g.addEdge(3, 5, 2);
g.addEdge(4, 5, 6);
cout << distance(g, 0, 5) << endl; // 输出3
return 0;
}
```
在这个实现中,我们使用 Dijkstra 算法来计算两个顶点的最短路径距离。如果两个顶点不连通,则返回0。
阅读全文