突然发现我的spfa速度快,空间小,代码短,真可谓是居家旅行之必备呀。。
空间:一个queue[maxn],dist[maxn]足以。
注:已经加了slf优化。
void spfa ()
{
memset (dist, 0x3F, sizeof (dist)), dist[1] = 0;
memset (queue, 0, sizeof (queue));
int head = 1, tail = 1, i, e, dtmp, p;
for (; head; head = queue[i], queue[i] = 0)
for (e = edge[i = head]; e; e = g[e].n)
if ((dtmp = dist[i] + g[e].c) < dist[p = g[e].t])
{
dist[p] = dtmp;
if (queue[p] || p == tail) continue;
if (dtmp < dist[queue[i]] && head != tail)
queue[p] = queue[i], queue[i] = p;
else
queue[tail] = p, tail = p;
}
}
2011.10.12更新:其实slf写错了dist[p] < dist[head] ----------------> dtmp < dist[queue[i]]