一、单源最短路径
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 (e.to >= n)
return true;
}
}
}
}
return false;
}
完
标签:int,MAX,ll,算法,vis,SPFA,INF,worth From: https://www.cnblogs.com/hoyd/p/18032726