SPFA模板

感谢书神的模板!!!

int spfa(int s,int n)//单源最短路(s为起点,n为节点总数)
{
    int u;
    for (int i=0; i<=n; i++)
        dis[i]=INF;
    memset(vis,0,sizeof(vis));
    queue<int> que;
    que.push(s);
    vis[s]=true;
    dis[s]=0;
    while (!que.empty())
    {
        u=que.front();
        que.pop();
        vis[u]=false;
        for (int i=head[u]; i!=-1; i=edge[i].next)
        {
            int v=edge[i].v;
            int w=edge[i].w;
            if (dis[v]>dis[u]+w)
            {
                dis[v]=dis[u]+w;
                if (!vis[v])
                {
                    vis[v]=true;
                    que.push(v);
                    way[v]++;
                    if(way[v]>n)
                        return 0;
                }
            }
        }
    }
    return 1;
}
// PS:如果需要判负环,另外设置一个数组c记录每个点的进队列次数,大于总点数则有环,返回0;

 

posted @ 2015-08-09 15:05  JoneZP  阅读(154)  评论(0编辑  收藏  举报