$$\color{red}{算法}\color{blue}{基础课}\color{purple}{笔记and题解}\color{green}{汇总}$$
$dist_x$ 表示 1 到 x 的最短路径
$cnt_x$ 表示当前最短路的边数。
更新的时候:
dist[x] = dist[t] + w[i];
cnt[x] = cnt[t] + 1;
如果cnt[x]大于等于 $n$,那么说明存在负环。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 2e3 + 10, M = 1e4 + 10;
int n, m, head[N], e[M], ne[M], w[M], idx;
bool st[N];
int dist[N], cnt[N];
void add(int a, int b, int c) {
e[idx] = b;
ne[idx] = head[a];
w[idx] = c;
head[a] = idx++;
}
bool spfa() {
queue<int> q;
for (int i = 1; i <= n ;i++) {
q.push(i); st[i] = true;
}
while (q.size()) {
int t = q.front();
q.pop();
st[t] = false;
for (int i= head[t]; ~i; i = ne[i]) {
int j = e[i];
if (dist[j] > dist[t] + w[i]) {
dist[j] = dist[t] + w[i];
cnt[j] = cnt[t] + 1;
if (cnt[j] >= n) {
return 1;
}
if (!st[j]) {
q.push(j); st[j] = true;
}
}
}
}
return 0;
}
int main() {
cin>>n>>m;
memset(head, -1, sizeof head);
for (int i = 0; i < m; i++) {
int a, b, c; cin>>a>>b>>c;
add(a,b,c);
}
puts(spfa()?"Yes":"No");
}
为什么这里用stack优化的话比用queue快1600多ms
说明用 stack 效率更高((
可以试试 vector?
似乎是因为stack是dfs的操作,遇到负环搜一遍直接就return了,不用全搜完罢
所以用stack只能用来求负环,不能求最短路
666