O ( k*E )
bool SPFA(int s){
queue <int> q;
memset(dis,INF,sizeof(dis));
memset(cnt,0,sizeof(cnt));
memset(visit,false,sizeof(visit));
dis[s]=0;
q.push(s);
visit[s]=true;
while(!q.empty()){
int x=q.front();
q.pop();
visit[x]=false;
for(int i=head[x];i!=-1;i=edge[i].next){
int v=edge[i].to;
if(dis[x]+edge[i].cost<dis[v]){
dis[v]=dis[x]+edge[i].cost;
if(!visit[v]){
visit[v]=true;
q.push(v);
if(++cnt[v]>=n)return false; // 统计入队次数,超过n说明有负环
}
}
}
}
return true;
}