spfa单源检测

#include<bits/stdc++.h>
using namespace std;
const int inf = INT_MAX;

void spfa(int v, vector<vector<pair<int, int>>& edge, int sources) {
    vector<int> dis(v, inf);    // 初始化距离为正无穷
    vector<int> inQueue(v, 0);  // 标记当前点是否在队列中
    vector<int> count(v, 0);    // 记录每个点被放入队列的次数,用于检测负权环
    queue<int> q;               // 使用队列存储待处理的节点
    
    dis[sources] = 0;           // 起点到自己的距离为 0
    q.push(sources);
    inQueue[sources] = 1;       // 起点加入队列
    count[sources] = 1;

    while (!q.empty()) {
        int u = q.front();
        q.pop();
        inQueue[u] = 0;         // 标记点 u 出队列

        // 遍历 u 的所有邻接点
        for (auto& d : edge[u]) {
            int v = d.first;    // 邻接点
            int w = d.second;   // 权重
            if (dis[u] + w < dis[v]) { // 松弛操作
                dis[v] = dis[u] + w;

                // 如果 v 不在队列中,将其加入队列
                if (!inQueue[v]) {
                    q.push(v);
                    inQueue[v] = 1;

                    count[v]++; // 记录 v 入队次数

                    // 如果某个点的入队次数超过顶点数 v,说明存在负权环
                    if (count[v] > v) {
                        cout << "Graph contains a negative-weight cycle!" << endl;
                        return;
                    }
                }
            }
        }
    }

    // 输出所有点到源点的最短路径
    for (int i = 0; i < v; i++) {
        if (dis[i] == inf) {
            cout << "INF ";
        } else {
            cout << dis[i] << " ";
        }
    }
    cout << endl;
}
posted @ 2025-04-19 20:30  Qacter  阅读(11)  评论(0)    收藏  举报