模板整理——图论·最短路·spfa

来源:互联网 发布:三星系统升级软件 编辑:程序博客网 时间:2024/06/10 14:13

思想:每次取出队首u,弹出队首,松弛它的出边,并把u本次松弛的出边连接的未入队的点入队,若一个点入队次数超过n,说明有负权圈

时间复杂度:O(m*k)[k是常数,听说是2or3,蒟蒻表示不清楚~] 那就假设是对的吧~

queue <int> q;bool spfa(int s){    for (int i=1; i<=n; i++) dis[i]=oo;     dis[s]=0;    memset(in,0,sizeof(in));    memset(vis,0,sizeof(vis));    q.push(s);      vis[s]=1;     in[s]=1;    while(!q.empty())    {        int u=q.front();        q.pop();          vis[u]=0;        for (int i=head[u]; i; i=next[i])        {            int v=vet[i];            if (dis[v]>dis[u]+val[i])            {                dis[v]=dis[u]+val[i];                if (!vis[v])                {                    vis[v]=1;                    in[v]++;                    q.push(v);                    if (in[v]>n) return 1;                }            }        }    }    return 0;}