以下将队列优化的 B e l l m a n − F o r d \mathfrak{Bellman-Ford} Bellman−Ford简称为 s p f a \mathfrak{spfa} spfa。
首先:
"
d
f
s
_
s
p
f
a
"
\mathfrak{"dfs\_spfa"}
"dfs_spfa"可能会被构造数据卡到指数级别
Θ
(
2
n
)
\mathfrak{\Theta(2^n)}
Θ(2n)
其次:
s
p
f
a
\mathfrak{spfa}
spfa判负环的话,不要把某个点入队
n
\mathfrak{n}
n次作为判断标准。
实际上,
s
p
f
a
\mathfrak{spfa}
spfa在
b
f
s
\mathfrak{bfs}
bfs的过程中,如果
b
f
s
\mathfrak{bfs}
bfs搜索树的深度超过了
n
\mathfrak{n}
n,就是出现了负环。
以此为依据判断负环相对一般更优。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<cctype>
#include<cmath>
#include<ctime>
#include<queue>
using namespace std;
#define getchar() (frS==frT&&(frT=(frS=frBB)+fread(frBB,1,1<<12,stdin),frS==frT)?EOF:*frS++)
char frBB[1<<12],*frS=frBB,*frT=frBB;
inline void read(int&T)
{
int x=0;char ch=getchar();bool w=0;
while(!isdigit(ch))w|=(ch=='-'),ch=getchar();
while(isdigit(ch))x=x*10+(ch-48),ch=getchar();
T=w?-x:x;
}
#define PII pair<int,int>
priority_queue<PII,vector<PII>,greater<PII> >Q;
#define add_edge(a,b,c) nxt[++tot]=head[a],head[a]=tot,to[tot]=b,val[tot]=c
int T,N,M,tot=0;
int dis[3005]={};
bool vis[3005]={};
int nxt[6005]={},head[3005]={},to[6005]={},val[6005]={};
int ti[3005]={};
inline bool spfa()
{
register int x,i;
for(i=1;i<=N;++i)dis[i]=0x3f3f3f3f,vis[i]=ti[i]=0;
Q.push(make_pair(0,1)); dis[1]=0; ti[1]=1;
while(!Q.empty())
{
x=Q.top().second; Q.pop(); vis[x]=0;
for(i=head[x];i;i=nxt[i])
{
if(dis[to[i]]<=dis[x]+val[i])continue;
dis[to[i]]=dis[x]+val[i];
if(vis[to[i]])continue;
vis[to[i]]=1,Q.push(make_pair(dis[to[i]],to[i])),ti[to[i]]=ti[x]+1;
if(ti[to[i]]>N)return 0;
}
}
return 1;
}
#define spfa() spfa()
int main()
{
register int u,v,w,i;
read(T);
while(1)
{
read(N),read(M);
for(i=1;i<=M;++i)
{
read(u),read(v),read(w);
if(w>=0)add_edge(v,u,w);
add_edge(u,v,w);
}
puts(spfa()?"N0":"YE5");
if(!(--T))return 0;
for(i=1;i<=N;++i)head[i]=0; tot=0;
}
return 0;
}
p
s
.
\mathfrak{ps.}
ps.实际上还可以用
L
C
T
\mathcal{LCT}
LCT和
L
C
A
\mathcal{LCA}
LCA构建临时最短路树来做一些判断
这样可以达到降低期望复杂度的目的。当然复杂度上界不改变。
R
a
f
f
i
c
a
  
A
l
g
o
r
i
t
h
m
−
\mathfrak{Raffica\;Algorithm}-
RafficaAlgorithm−论文