SPFA()判环

1 SPFA()判负环

SPFA()判负环的原理就是在求最短路的过程中,如果存在负环,比如说要求从A到a的最短距离,设为s,但是经过a->c->b->a可以更短,所以如果一直经过a->c->b的话,会一直减小。所以说程序会一直对a进行是松弛,那么最多松弛多少次我们会发现有环呢?,答案是n次(n为点的个数)。(至于为什么,还不太理解以后再补吧)


code:

void add(int x,int y,int z){
    edge[cnt].to=y;
    edge[cnt].weight=z;
    edge[cnt].nxt=head[x];
    head[x]=cnt++; 
}
bool SPFA(){
    queue<int >que;
    que.push(1);
    mark[1]=1;
    dis[1]=0;
    num[1]=1;
    while(que.size()){
        int u=que.front();
        que.pop();
        mark[u]=0;
        for(int i=head[u];i!=-1;i=edge[i].nxt){
            int v=edge[i].to;
            if(dis[v]>dis[u]+edge[i].weight){
                dis[v]=dis[u]+edge[i].weight;
                if(!mark[v]) {
                    mark[v]=1;
                    num[v]++;
                    if(num[v]>=n) return 1;
                    que.push(v);
                }
            }
        } 
    } 
    return 0;
}

2 SPFA()判正环

判断正环是在最长路的基础上判断的, 原理个判负环一样,当存在正环时,正环会让环外一点到环上一点的距离无限增大。代码就是将判断条件换成 dis[v]<dis[u]+edge[i].weight.

原文地址:https://www.cnblogs.com/Accepting/p/12743214.html