有没有大神有实现求校园最短路径的算法代码,用c或者c++实现最好,自己直接上手编实在做不来,求助啦谢谢
该回答引用ChatGPT-3.5,仅供参考,不保证完全正确
当涉及到校园最短路径问题时,常见的算法是Dijkstra算法或者A*算法。这些算法可以用来找到从一个点到另一个点的最短路径。以下是一个使用Dijkstra算法的C++代码示例:
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
#define INF INT_MAX
// 图的邻接表表示
typedef pair<int, int> pii;
typedef vector<vector<pii>> Graph;
// Dijkstra算法求解最短路径
vector<int> Dijkstra(const Graph& graph, int source) {
int n = graph.size();
vector<int> dist(n, INF); // 到每个节点的最短距离
vector<bool> visited(n, false); // 标记节点是否已被访问
dist[source] = 0; // 设置源节点到自身的距离为0
// 优先队列,根据距离从小到大排序
priority_queue<pii, vector<pii>, greater<pii>> pq;
pq.push({0, source});
while (!pq.empty()) {
int u = pq.top().second; // 取出距离最小的节点
pq.pop();
if (visited[u]) {
continue;
}
visited[u] = true;
// 遍历u的邻居节点
for (const auto& neighbor : graph[u]) {
int v = neighbor.first;
int weight = neighbor.second;
if (dist[u] + weight < dist[v]) {
dist[v] = dist[u] + weight;
pq.push({dist[v], v});
}
}
}
return dist;
}
int main() {
int n, m;
cin >> n >> m; // 输入节点数量和边数量
Graph graph(n); // 创建一个空图
// 输入边的信息
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w; // 输入边的起点、终点和权重
graph[u].push_back({v, w});
graph[v].push_back({u, w});
}
int source, destination;
cin >> source >> destination; // 输入起点和终点
vector<int> shortestDistances = Dijkstra(graph, source); // 调用Dijkstra算法求解最短路径
int shortestDistance = shortestDistances[destination];
if (shortestDistance == INF) {
cout << "No path found!" << endl;
} else {
cout << "Shortest distance from " << source << " to " << destination << " is " << shortestDistance << endl;
}
return 0;
}
在上述代码中,我们首先使用邻接表表示图,然后实现了Dijkstra算法来计算最短路径。最后,我们从输入中获取起点和终点,并输出最短路径的长度。请注意,该代码假设输入是有效的,并且源节点和目标节点的编号从0开始。你可以根据实际情况进行适当的修改。