Bellmaxn-ford算法

const int maxn=1e4+5;
struct Edge{
    int from,to,dist;
    Edge(int u,int v,int d):from(u),to(v),dist(d){}
};
struct HeapNode{
    int d,u;
    HeapNode(int sd,int su):d(sd),u(su){}
    bool operator<(const HeapNode& rhs) const {
        return d>rhs.d;
    }
};
int n,m;
vector<Edge> edges;
vector<int> G[maxn];
int d[maxn],cnt[maxn],p[maxn];
bool inq[maxn];
bool bellman_ford(int s){
    queue<int>Q;
    memset(inq,0,sizeof(inq));
    memset(cnt,0,sizeof(cnt));
    for(int i=0;i<n;i++) d[i]=inf;
    d[s]=0;
    inq[s]=true;
    Q.push(s);
    while(!Q.empty()){
        int u=Q.front();Q.pop();
        inq[u]=false;
        for(int i=0;i<G[u].size();i++){
            Edge &e=edges[G[u][i]];
            if(d[u]<inf&&d[e.to]>d[u]+e.dist){
                d[e.to]=d[u]+e.dist;
                p[e.to]=G[u][i];
                if(!inq[e.to]) {
                    Q.push(e.to);inq[e.to]=true;           
                    if(++cnt[e.to]>n) return false;
                }
            }
        }
    } 
}

猜你喜欢

转载自www.cnblogs.com/033000-/p/10040454.html