图论——SPFA模板

来源:互联网 发布:java socket退出连接 编辑:程序博客网 时间:2024/06/08 11:29

SPFA是一种求最短路径的算法
SPFA的两种写法,bfs和dfs
判断有无负环:
如果某个点进入队列的次数超过N次则存在负环(SPFA无法处理带负环的图
bfs判别负环不稳定,相当于限深度搜索,但是设置得好的话还是没问题的,
dfs的话判断负环很快

下面贴出dfs判负环代码(只能判负环,不能求最短路(隔壁机房得出))

//flag 是否有负环void DFS_SPFA(int u){    if(flag)return;    vis[u]=true;    for(int i=head[u];i;i=edge[i].to){        if(flag)return;        int v=edge[i].v;        if(d[u]+edge[i].t<d[v]){            d[v]=d[u]+edge[i].t;            if(vis[v]){                flag=true;                return ;            }else{                DFS_SPFA(v);            }        }    }    vis[u]=false;}

spfa bfs求最短路模板

bfs的复杂度:
找出SPFA的最最坏到不可能的情况的复杂度为O(VE)。

其他情况O(玄学)【反正很快】

const int INF=1000000000;struct node{int to,v;};int n,m;int dis[M];bool mark[M];queue<int>q;vector<node>edge[M]; void spfa(int a){    FOR(i,1,n+1)dis[i]=INF;    dis[a]=0;    q.push(a);    while(!q.empty()){        int x=q.front();q.pop();        mark[x]=0;        FOR(i,0,edge[x].size()){            int y=edge[x][i].to;            if(dis[y]>dis[x]+edge[x][i].v){                dis[y]=dis[x]+edge[x][i].v;                if(!mark[y]){                    q.push(y);                    mark[y]=1;                }            }        }    }}

用bfs判负环的时候,若进入负环n次后,说明有负环