//大致的思路如下: queue<int>q; 源点 s 入队; while(!q.empty()) { 取出队首元素u; for(u的所有邻接边u->v) { if(d[u]+dis<d[v]) { d[v]=d[u]+dis; if(v不在队列当中) { v入队; if(v入队的次数大于n-1) { 说明有负环 return false; } } } } } //具体的实现: vector<Node>Adj[MAXV]; int n,d[MAXV],num[MAXV]; bool vis[MAXV]; bool SPFA(int s) { memset(vis,0,sizeof(s)); memset(num,0,sizeof(num)); fill(d,d+MAXV,INF); queue<int>Q; Q.push(s); vis[s]=true; num[s]++; d[s]=0; while(Q.empty()) { int u=Q.front(); Q.pop(); vis[u]=false; for(int j=0;j<A[u].size();j++) { int v=A[u][j].v; int dis=Adj[u][j].dis; if(d[u]+dis<d[v]) { d[v]=d[u]+dis; if(vis[v]==false) { Q.push(v); vis[v]=true; num[v]++; if(num[v]>=n) return false; } } } } return true; }