SPFA算法
一、单源最短路径
typedef long long ll;
const int MAX = 2e3 + 5;
const ll INF = numeric_limits<ll>::max();
typedef struct
{
int to, worth;
} edge;
int n, m;
vector<edge> G[MAX];
ll d[MAX];
bool vis[MAX];
void spfa(int s)
{
fill(d + 1, d + 1 + n, INF);
d[s] = 0;
queue<int> Q;
Q.push(s);
vis[s] = true;
while (!Q.empty())
{
int u = Q.front();
Q.pop();
vis[u] = false;
for (int i = 0; i < G[u].size(); i++)
{
edge e = G[u][i];
if (d[u] != INF && d[e.to] > d[u] + e.worth)
{
d[e.to] = d[u] + e.worth;
if (!vis[e.to])
{
Q.push(e.to);
vis[e.to] = true;
}
}
}
}
}
二、判断负环
typedef long long ll;
const int MAX = 2e3 + 5;
const ll INF = numeric_limits<ll>::max();
typedef struct
{
int to, worth;
} edge;
int n, m;
vector<edge> G[MAX];
ll d[MAX];
bool vis[MAX];
int cnt[MAX]; // 各点遍历次数
bool spfa(int s)
{
fill(d + 1, d + 1 + n, INF);
d[s] = 0;
queue<int> Q;
Q.push(s);
vis[s] = true;
cnt[s]++;
while (!Q.empty())
{
int u = Q.front();
Q.pop();
vis[u] = false;
for (int i = 0; i < G[u].size(); i++)
{
edge e = G[u][i];
if (d[u] != INF && d[e.to] > d[u] + e.worth)
{
d[e.to] = d[u] + e.worth;
if (!vis[e.to])
{
Q.push(e.to);
vis[e.to] = true;
cnt[e.to]++;
if (cnt[e.to] >= n)
return true;
}
}
}
}
return false;
}
完
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具