SPFA算法 struct Node { int v; int dis; Node(int _v, int _dis) : v(_v), dis(_dis) {} //构造函数 }; int n, m, s, e; //顶点个数,边数,起点编号,终点编号 vector<Node> Adj[maxv]; int d[maxv]; //从起点到各点的最短距离 int num[maxv]; //记录顶点的入队次数 bool inq[maxv] = {false}; //顶点是否在队列中 bool SPFA(int s) { fill(d, d + maxv, INF); queue<int> Q; Q.push(s); num[s] = 1; inq[s] = true; d[s] = 0; while (!Q.empty()) { int u = Q.front(); Q.pop(); inq[u] = false; for (int i = 0; i < Adj[u].size(); i++) { int v = Adj[u][i].v; int dis = Adj[u][i].dis; if (d[v] > dis + d[u]) { if (inq[v] == false) { Q.push(v); inq[v] = true; num[v]++; if (num[v] >= n) { return false; //有可达负环 } } } } } return true; //无可达负环 }