算法对比SPFA, dijkstra, 堆优化dijkstra 说明YXC NB
YXC 用的模拟循环队列, 但是开的数组大小只为n,由于存在双向边, 可能存在段错误的风险,但是y总直接弄个
if(hh == N)hh = 0;
if(tt == N)tt = 0;
循环队列
极大化利用了空间的效率
NB;
对比三种算法时间
从上自下依次为 dijkstra,堆优化dijkstra,SPFA.
自己体会
C++ 代码
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
const int N = 2510, M = 6200 * 2 + 10;
int h[N], e[M], ne[M], w[M], idx;
bool st[N];
int dist[N];
int n, m, S, T;
void add(int a, int b, int c)
{
e[++ idx] = b;
ne[idx] = h[a];
h[a] = idx;
w[idx] = c;
}
void SPFA()
{
memset(dist, 0x3f, sizeof dist);
dist[S] = 0;
queue<int> q;
q.push(S);
while(q.size())
{
int t = q.front();
q.pop();
st[t] = false;
for(int i = h[t]; ~i; i = ne[i])
{
int j = e[i];
if(dist[j] > dist[t] + w[i])
{
dist[j] = dist[t] + w[i];
if(!st[j])
st[j] = true, q.push(j);
}
}
}
}
int main()
{
memset(h, - 1, sizeof h);
cin >> n >> m >> S >> T;
for(int i = 0; i < m; i ++)
{
int a, b, c;
cin >> a >> b >> c;
add(a, b, c);
add(b, a, c);
}
SPFA();
cout << dist[T] << endl;
return 0;
}
为啥if… hh==0就不会出错啊万一 队列加了很多边 那不是直接乱了
关于SPFA,它死了
??
在NOI2017D1T1中,出题人构造了让SPFA跑到最坏时间复杂度$O(nm)$的数据,导致使用SPFA的程序TLE.如此正式的比赛也卡了SPFA,所以说它”死了”.
哦哦,这样啊!了解了QAQ!
不太懂
由于NOIP只能提交一次并且SPFA可以被卡,我们用的时候就要按照最坏的时间复杂度计算也就是O(NM)如果超时直接pass换成其他算法。
万能的堆优化dijkstra
hh