题目描述
现在有n个点(n<=400),m条边(m<=400*399/2),要求一个起点到终点的最短距离
输入
第一行n,m,起点s,终点e
接下去m行,每行3个整数x,y,z表示x到y有一条长度为z的无向边。
输出
一个整数,s到e的最短距离
样例
输入 复制
3 2 1 3 1 2 3 2 3 5
输出 复制
8
AC代码:
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
typedef pair<int, int> pii;
void dijkstra(vector<vector<pii> >& graph, int start, int end) {
int n = graph.size();
vector<int> distances(n, INT_MAX);
priority_queue<pii, vector<pii>, greater<pii> > pq;
distances[start] = 0;
pq.push(make_pair(0, start));
while (!pq.empty()) {
int cur_dist = pq.top().first;
int cur_node = pq.top().second;
pq.pop();
if (cur_dist > distances[cur_node]) {
continue;
}
for (pii neighbor : graph[cur_node]) {
int neighbor_node = neighbor.first;
int neighbor_dist = neighbor.second;
if (distances[cur_node] + neighbor_dist < distances[neighbor_node]) {
distances[neighbor_node] = distances[cur_node] + neighbor_dist;
pq.push(make_pair(distances[neighbor_node], neighbor_node));
}
}
}
cout << distances[end] << endl;
}
int main() {
int n, m, start, end;
cin >> n >> m >> start >> end;
vector<vector<pii>> graph(n + 1);
for (int i = 0; i < m; i++) {
int x, y, z;
cin >> x >> y >> z;
graph[x].push_back(make_pair(y, z));
graph[y].push_back(make_pair(x, z));
}
dijkstra(graph, start, end);
return 0;
}