给定的题目要求我们求出最长路,众所周知我们只学过最短路算法,但是解决思路的话也很简单,那就是将边的权值取反,然后利用最短路算法SPFA求出她的最短路,将得到的权值取反输出,得到的就是最长路。
但是就这样算下的话我们只会得到78分,聪明的小美小帅会认真研究题目发现还有到达不了的情况,于是我们特判一下。
好了,现在89分,怎么都找不到哪里出现了错误,原来是还有边数为0的情况,这带给我们思考。
在有关图中的判断中,我们需要思考几点,边数为0的情况,到达不了的情况等等,这样才能让答案完美。
#include <bits/stdc++.h>
using namespace std;
const int N = 500050;
int h[N];
int e[N];
int ne[N];
int w[N];
int idx;
bool st[N];
int dist[N];
int n, m;
void add(int a, int b, int c) {
e[idx] = b;
w[idx] = -c;
ne[idx] = h[a];
h[a] = idx++;
}
void spfa() {
memset(dist, 0x3f, sizeof(dist));
dist[1] = 0;
queue<int>q;
q.push(1);
st[1] = true;
while (q.size()) {
auto t = q.front();
q.pop();
st[t] = false;
for (int i = h[t]; i != -1; i = ne[i]) {
int j = e[i];
if (dist[j] > dist[t] + w[i]) {
dist[j] = dist[t] + w[i];
if (!st[j]) {
q.push(j);
st[j] = true;
}
}
}
}
}
int main() {
memset(h, -1, sizeof(h));
cin >> n >> m;
if (m == 0)
cout << "-1" << "\n";
for (int i = 1; i <= m; i++) {
int a, b, c;
cin >> a >> b >> c;
add(a, b, c);
}
spfa();
cout << -dist[n] << "\n";
}