- SPFA适用于稀疏图或者有负权边的图。
- 由于其算法特性,使用邻接矩阵性能会大打折扣。
- 时间复杂度一般认为是O(kE),E为边数,多数情况k=2。
struct edge{
int v,w,next;
}e[maxm];
int last[maxn],d[maxn],cnt,s,t,inq[maxn];//inq用来表示某个结点是否在队列中(1/0),防止一个点被多次松弛后在队列中出现多次。
void spfa(){
queue<int>q;//q用来存点
for(int i=1;i<=maxn;i++)
d[i]=0x3f3f3f;
d[s]=0;inq[s]=1;q.push(s);
while(!q.empty()){
int u=q.front();q.pop();inq[u]=0;
for(int i=last[u];i;i=e[i].next)
{
int v=e[i].v;
if(d[v]>d[u]+e[i].w){
d[v]=d[u]+e[i].w;//松弛,松弛后v与其它点直接可能需要松弛,v入队
if(!inq[v]){
inq[v]=1;q.push(v);
}
}
}
}
}