今天的建议依然是,一刷的时候,能了解 原理,照着代码随想录能抄下来代码就好,就算达标。
二刷的时候自己尝试独立去写,三刷的时候 才能有一定深度理解各个最短路算法。
dijkstra(堆优化版)精讲
#include <iostream>
#include <list>
#include <queue>
#include <vector>
#include <climits>
using namespace std;
class myComparison {
bool operator()( const pair<int, int>& lhs, const pair<int, int>& rhs ) {
return lhs.second > rhs.second;
}
};
struct Edge {
int to;
int val;
Edge(int to,int val):to(to),val(val){}
};
void solve() {
int n, m, v1, v2, val;
cin >> n >> m;
//建图
vector <list<Edge>>grid(n + 1);
while (m--) {
cin >> v1 >> v2 >> val;
grid[v1].push_back({ v2,val });
}
//表示开始和结束的节点
int start = 1;
int end = n;
vector<bool>visited(n + 1, false);//记录访问的节点
vector<int>minDist(n + 1, INT_MAX);//表示节点距离原点的当前最近距离
//优先队列存放的是 pair<节点,原点到该节点的权值>
priority_queue<pair<int, int>, list<pair<int, int>>, myComparison>pq;
pq.push(pair<int, int>(start, 0));
minDist[start] = 0;
while (!pq.empty()) {
pair<int,int>node = pq.top();
pq.pop();
if (visited[node.first])continue;
visited[node.first] = true;
for (Edge edge : grid[node.first]) {
if (!visited[edge.to] && minDist[node.first] + edge.val < minDist[edge.to]) {
minDist[edge.to] = minDist[node.first] + edge.val;
pq.push({ edge.to, minDist[edge.to] });
}
}
}
if (minDist[end] == INT_MAX)cout << -1 << endl;
else cout << minDist[end] << endl;
}
int main() {
solve();
return 0;
}
Bellman_ford 算法精讲
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
void solve() {
int n, m, v1, v2, val;
cin >> n >> m;
vector<vector<int>>grid;
for (int i = 0; i < m; i++) {
cin >> v1 >> v2 >> val;
grid.push_back({ v1,v2,val });
}
int start = 1;
int end = n;
vector<int>minDist(n + 1, INT_MAX);
for (int i = 0; i < n; i++) {//进行n-1次松弛,每一次确定一个最近点
for (vector<int>& node : grid) {
int from = node[0];
int to = node[1];
int price = node[2];
if (minDist[from] != INT_MAX && minDist[to] > minDist[from] + price) {
minDist[to] = minDist[from] + price;
}
}
}
if (minDist[end] == INT_MAX)cout << "unconnected" << endl;
else cout << minDist[end] << endl;
}
int main() {
solve();
return 0;
}