题解:P1807 最长路
我们可以使用 SPFA 解决这道题目。
我们容易发现,当我们跑完最短路后,一定会有
SPFA 最坏时间复杂度为
参考代码如下:
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int n, m;
vector < pair <int, int> > e[1504];
queue <int> q;
long long dis[1504];
bool vis[1504];
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int u, v, w;
cin >> u >> v >> w;
e[u].emplace_back(v, w);
}
q.push(1);
for (int i = 1; i <= n; i++) {
dis[i] = -1145141919810;
}
dis[1] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
vis[u] = 0;
for (auto [v, w] : e[u]) {
if (dis[v] < dis[u] + w) {
dis[v] = dis[u] + w;
if (!vis[v]) {
vis[v] = 1;
q.push(v);
}
}
}
}
cout << (dis[n] == -1145141919810 ? -1 : dis[n]);
}