#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;
}