SPFA算法

Posted 萌新上路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SPFA算法相关的知识,希望对你有一定的参考价值。

n个点,m条边,源点s,求单源最短路径

 

 

 
            #include <stdio.h>
#include <queue>
using namespace std;
struct node
{
    int x;
    int next;
    int val;    
}a[40001];
int n,m;
int dis[2001],st[2001],vis[2001];
void spfa(int x)
{
    queue<int> q;
    int i;
    q.push(x);
    vis[x]=1;
    dis[x]=0;
    while(!q.empty())
    {
        int f=q.front();
        q.pop();
        vis[f]=0;
        i=st[f];
        while(i)
        {
            int b=a[i].x;
            int eg=a[i].val;
            if(dis[b] > dis[f] + eg)
            {
                dis[b]=dis[f] + eg;
                if(b == x) 
                {
                    if(dis[b] < 0) 
                    {
                        printf("EL PSY CONGROO\n");
                        return;
                    }
                }
                if(!vis[b])
                {
                    q.push(b);
                    vis[b]=1;
                }
            }
            i=a[i].next;
        }
    }
    printf("ttt\n");
}
int main()
{
    int u,v,w,i;
    scanf("%d %d",&n,&m);
    for(i=1; i<=2001; i++)
    {
        vis[i]=0;
        dis[i]=10000000;
        st[i]=0;
    }
    for(i=1; i<=m; i++)
    {
        scanf("%d %d %d",&u,&v,&w);
        a[i].x=v;                 
        a[i].val=w;
        a[i].next=st[u];        
        st[u]=i;
    }
    scanf("%d",&u);
    spfa(u);
    return 0;
}

 

 

上面一个比下面一个快

            
#include<iostream>
#include<queue>
#include<string.h>
#include<stdio.h>
using namespace std;
const int maxn = 40001;
struct Edge 
{
    int to;
    int next;
    int w;
}edge[maxn];
int p[maxn],dis[maxn],in[maxn];
bool vis[maxn];
int n,m;
void spfa(int s)
{
    int i,t,temp;
    queue<int> q;
    memset(vis,0,sizeof(vis));
    memset(dis,0x3f,sizeof(dis));
    memset(in,0,sizeof(in));
    q.push(s);
    vis[s]=true;
    dis[s]=0;
    while(!q.empty()) 
    {
        t=q.front();
        q.pop();
        vis[t]=false;
        for(i=p[t];i;i=edge[i].next) 
        {
            temp=edge[i].to;
            if(dis[temp]>dis[t]+edge[i].w)
            {
                dis[temp]=dis[t]+edge[i].w;
                if(!vis[temp]) 
                {
                    q.push(temp);
                    vis[temp]=true;
                    if(++in[temp]>n) 
                    {
                        printf("EL PSY CONGROO");
                        return;
                    }
                }
            }
        }
    }
    printf("ttt");
    return;
}
int main(){
    int i,s,u,v,w,cnt=0;
    //cin>>n>>m;
    scanf("%d %d",&n,&m);
    for(i=1;i<=m;i++) 
    {
        //cin>>u>>v>>w;
        scanf("%d %d %d",&u,&v,&w);
        edge[++cnt].to=v;
        edge[cnt].next=p[u];
        edge[cnt].w=w;
        p[u]=cnt;
    }
    //cin>>s;
    scanf("%d",&s);
    spfa(s);
    return 0;
}
        
        
        

 

以上是关于SPFA算法的主要内容,如果未能解决你的问题,请参考以下文章

SPFA算法以及负环判断模板

SPFA最短路算法

算法描述》关于SPFA和Dijkstra算法的两三事

题目1008:最短路径问题(SPFA算法)

最短路径——SPFA算法(C++)

hdoj2544 最短路(Dijkstra || Floyd || SPFA)