天天看點

SPFA

//------------SPFA-------------
#define MOVE(x) (x=(x+1)%n)
int map[N][N];
int queue[N],front,rear;
int dist[N];
bool flag[N];
int record[N];

bool SPFA(int n,int s)
{
    int i,u;
    front=rear=0;
    for(i=1;i<=n;i++)
    {
        dist[i]=map[s][i];
        flag[i]=false;
        if(dist[i]!=MAXDIST)
        {
            queue[MOVE(rear)]=i;
            flag[i]=true;
            record[i]++;
        }
    }
    while(front!=rear)
    {
        u=queue[MOVE(front)];
        flag[u]=false;
        for(i=1;i<=n;i++)
        {
            if(dist[u]+map[u][i]<dist[i])
            {
                dist[i]=dist[u]+map[u][i];
                if(!flag[i])
                {
                    queue[MOVE(rear)]=i;
                    if(++record[i]>n)    return false;//你說這行寫的對不?
                }
            }
        }
    }

    return true;
}