SPFA模板 Bellmanford优化版

SPFA模板:

queue<int>Q;
bool inq[510];
int dis[510],sumv[510];
int n,v[510*3],__next[510*3],e,w[510*3],first[510],cnts[510];
void AddEdge(int U,int V,int W) {
    v[++e]=V;
    w[e]=W;
    __next[e]=first[U];
    first[U]=e;
}

bool spfa(const int &s) {
    memset(dis,0x7f,sizeof(dis));
    dis[s]=0;
    Q.push(s);
    inq[s]=1;
    ++cnts[s];
    while(!Q.empty()) {
        int U=Q.front();
        for(int i=first[U]; i; i=__next[i])
            if(dis[v[i]]>dis[U]+w[i]) {
                dis[v[i]]=dis[U]+w[i];
                if(!inq[v[i]]) {
                    Q.push(v[i]);
                    inq[v[i]]=1;
                    ++cnts[v[i]];
                    if(cnts[v[i]]>n+1)
                        return 0;
                }
            }
        Q.pop();
        inq[U]=0;
    }
    return 1;
}

原文地址:https://www.cnblogs.com/zinyy/p/9139097.html

时间: 2024-11-05 22:53:49

SPFA模板 Bellmanford优化版的相关文章

[负环问题解法]使用spfa和bellman-ford

终于开始认真对待图论了 因为听说一直是提高组的,动得很少,直到现在机房打提高的氛围下,开始学一些皮毛的东西 模板题目链接 这是一道求负环的题目,照理来说大家都是用spfa来判断负环的 但是我觉得bellman-ford更优 并且在这个模板题目中,spfa开O2过,bellman不开O2还比spfa快? 为什么呢? 因为 关于spfa ——他死了 (所以机房基本所有人转dijistra了) 但是dijistra无法解决负环问题 因此选择bellman和spfa(队列优化的bellman) 其实还可

最短路知识点总结(Dijkstra,Floyd,SPFA,Bellman-Ford)

Dijkstra算法: 解决的问题: 带权重的有向图上单源最短路径问题.且权重都为非负值.如果采用的实现方法合适,Dijkstra运行时间要低于Bellman-Ford算法. 思路: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么(Vi...Vk)也必定是从i到k的最短路径.为了求出最短路径,Dijkstra就提出了以最短路径长度递增,逐次生成最短路径的算法.譬如对于源顶点V0,首先选择其直接相邻的顶点中长度最短的顶点Vi,那么当前已知可得从V0到达Vj

flask 大型教程项目优化版(1):Hello World

Hello World 作者背景 作者是一个使用多种语言开发复杂程序并且拥有十多年经验的软件工程师.作者第一次学习 Python 是在为一个 C++ 库创建绑定的时候. 除了 Python,作者曾经用 PHP, Ruby, Smalltalk 甚至 C++ 写过 web 应用.在所有这些中,Python/Flask 组合是作者认为最为自由的一种. 应用程序简介 作为本教程的一部分–我要开发的应用程序是一个极具特色的微博服务器,我称之为 microblog . 我会随着应用程序的不断地进展将涉及到

费用流mcmf模板2.0版

题目地址:HDU 3488 今晚才发现以前的费用流模板居然是错的.......有漏洞....但是居然都AC了那么多题..想想也是..做的费用流也不多,而且都是流量为1的,这个漏洞是不会影响的.因为以前在每次最小费用增广后找到的最小流量是经过的所有路的最小流量,不一定是可以到达汇点的最小流量..但是如果流量都为1的话..那只要边没有全部流过,那肯定最小流量会是1.而如果已经全部流过的话..那也没意义了..已经到达了最大流了.所以说这个漏洞一直都没被发现... 那么应该如何改进呢.那就是跟最短路的方

spfa的SLF优化

spfa的SLF优化就是small label first 优化,当加入一个新点v的时候如果此时的dis[v]比队首dis[q.front()]还要小的话,就把v点加入到队首,否则把他加入到队尾,因为先扩展最小的点可以尽量使程序尽早的结束,一种方法可以用模拟队列,head,tail,但是由于不知道q的数组开多大,所有用双端队列deque<int>q更好些 模板: void spfa(int s) { deque<int>q; memset(dis,inf,sizeof(dis));

关于SPFA算法的优化方式

关于SPFA算法的优化方式 这篇随笔讲解信息学奥林匹克竞赛中图论部分的求最短路算法SPFA的两种优化方式.学习这两种优化算法需要有SPFA朴素算法的学习经验.在本随笔中SPFA朴素算法的相关知识将不予赘述. 上课! No.1 SLF优化(Small Label First) 顾名思义,这种优化采用的方式是把较小元素提前. 就像dijkstra算法的堆优化一样.我们在求解最短路算法的时候是采取对图的遍历,每次求最小边的一个过程,为了寻找最小边,我们需要枚举每一条出边,如果我们一上来就找到这个边,那

POJ-2533最长上升子序列(DP+二分)(优化版)

Longest Ordered Subsequence Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 41944   Accepted: 18453 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ...

畅通工程续 (SPFA模板Floy模板)

http://acm.hdu.edu.cn/showproblem.php?pid=1874 SPFA #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #define N 1000001 using namespace std; int n,m; int v[202],dis[202]; struct node { int x,y,z,next; }

优化版的冒泡排序

;优化版的冒泡排序,最好的情况为线性阶 ,最坏的情况为平方阶 ;算法的最好情况,如一个拍好序列的数组那么做排序,那么就会有几行代码不会产生交换的情况 最坏的情况是全部都交换 ;code /* 此冒泡最好情况被优化为线性阶 最坏就是平方阶 */ void bubble(int arr[3],int n) { int bChange=1,i=0,j=0; for(i=0;i<n&&bChange==1;++i)//n次 { bChange=0; for(j=0;j<n;++j)//