spfa--Bellman-Ford的队列优化

spfa是一种神奇的最短路算法。
它既可以快速的找最短路,有可以判断负循环。
还是很好用的。
代码也比较简单。
STL;
核心思想:
与其他的思想差不了多少,不断的判断。
如果这个点的距离被更新,它附近的点也会进队列的。
只是多了个判断。
~因为负权环会无限的进入队列。
是吧?

以下是代码:

//假如有n个点,dis记录距离,p数组判断是否在队列中,sum记录进入队列的次数
q.push(1); 
dis[1]=0;p[1]=1;sum[1]++;
while(!q.empty()){
    int k=q.front();
    q.pop();
    p[k]=0;
    for(int i=begin[k];i;i=next[i]){//链式前向星
        int u=to[i];
        if(!p[u] && dis[u]>dis[k]+w[u]){
            dis[u]=dis[k]+w[u];
            if(!p[u]){
                q.push(u);
                p[u]=1; 
                sum[u]++;
                if(sum[u]>n){
                    flag=1;
                    break;
                    }
                }
            }
        }
    }
    if(flag==1)printf("此图含有负权环");
    return dis[m];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值