//大致的思路如下:
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;
}