spfa算法

来源:互联网 发布:centos 7.3 安装vftp 编辑:程序博客网 时间:2024/05/20 20:48
带负环的图求最小路径带负环 return FALSE, 不带负环 return TRUE;
    #include <iostream>    #include <cstdio>    #include <cstring>    #include <algorithm>    #include <queue>    #defind ms(s, t) memeset(s, t, sizeof(s));    using namespace std;    const int maxn = 100000;    const int INF = 0x3fffffff;    struct Edge{        int from, to;        int value;        int count;    }edges[maxn]; //结构体数组实现邻接表    int d[maxn];    //路径长度    int head[maxn]; //存储头结点    bool visit[maxn]; //判断是否遍历过    void init(){        ms(visit, 0);        ms(d, INF);    }    void readin(){    }    void spfa_bfs(int s){        init();        queue<int> q;        q.push(s);        visit[s] = 1;        d[s] = 0;        while(!q.empty())        {            int t = q.front();            q.pop();            visit[t] = 0;            for(int i = head[t]; i != 0; i = edges[i].to){                int tmp = edges[i].to;                if(d[tmp] > d[t] + edges[i].value){                    d[tmp] =     d[t] + edges[i].value;                    if(!visite[tmp]){                        q.push(tmp);                        edges[i].count ++;                        visit[tmp] = 1;                        if(edges[tmp].count > n) return false; //如队数超出上限 带负环                    }                }            }        }        return true;    }