spfa
可以判断是否有负环,可与 dijkstra 连用
void solve() {
int n, m;cin >> n >> m;
vector<vector<pair<int, int>>> g(n + 1);
for (int i = 0;i < m;i++) {
int u, v, w;cin >> u >> v >> w;
if (w >= 0) {
g[v].push_back({u,w});
}
g[u].push_back({v,w});
}
queue<int> q;
vector<int> dis(n + 1, INT_MAX), vis(n + 1), cnt(n + 1);
dis[1] = 0;vis[1] = 1;
q.push(1);
while (q.size()) {
int u = q.front();q.pop();
vis[u] = 0;
for (auto [v, w] : g[u]) {
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
cnt[v] = cnt[u] + 1;
if (cnt[v] >= n) {
cout << "YES\n";return;
}
if (vis[v] == 0) {
vis[v] = 1;q.push(v);
}
}
}
}
cout << "NO\n";
}
#include<bits/stdc++.h>
using namespace std;
int t,n,m;
struct{
int v, w, next;
} a[100000];
int head[50000],dis[50000],cnt[50000];
bool vis[50000];
int edge;
queue<int> q;
void add(int u,int v,int w)
{
a[++edge].v = v;
a[edge].w = w;
a[edge].next = head[u];
head[u] = edge;
}
void spfa()
{
memset(dis, 0x3f, sizeof dis);
memset(vis, false, sizeof vis);
memset(cnt, 0, sizeof cnt);
while(!q.empty())
q.pop();
dis[1] = 0;
vis[1] = 1;
q.push(1);
while(q.size())
{
int u = q.front();
q.pop();
vis[u] = 0;
for (int i = head[u]; i;i=a[i].next)
{
int v = a[i].v, w = a[i].w;
if(dis[v]>dis[u]+w)
{
dis[v] = dis[u] + w;
cnt[v] = cnt[u] + 1;
if(cnt[v]>=n)
{
cout << "YES" << endl;
return;
}
if(!vis[v])
vis[v] = 1, q.push(v);
}
}
}
cout << "NO" << endl;
}
int main()
{
ios::sync_with_stdio(0);
cin >> t;
while(t--)
{
memset(head, 0, sizeof head);///////
cin >> n >> m;
while(m--)
{
int u, v, w;
cin >> u >> v >> w;
add(u, v, w);
if(w>=0)
add(v, u, w);
}
spfa();
}
}