Dijkstra(堆优化)
memset(dis, 64, sizeof(dis));
dis[s] = 0;
q.push({ s,0 });
while (!q.empty())
{
int u = q.top().v;
q.pop();
if (vis[u])continue;
vis[u] = true;
for (int i = h[u]; i; i = g[i].nxt)
if (dis[g[i].to] > dis[u] + g[i].val)
{
dis[g[i].to] = dis[u] + g[i].val;
q.push({ g[i].to,dis[g[i].to] });
}
}
SPFA
memset(dis, 64, sizeof(dis));
dis[s] = 0, vis[s] = true, q.push(s);
while (!q.empty())
{
int u = q.front();
q.pop();
vis[u] = false;
for (int i = h[u]; i; i = g[i].nxt)
if (dis[g[i].to] > (long long)dis[u] + g[i].val)
{
dis[g[i].to] = dis[u] + g[i].val;
if (!vis[g[i].to])
q.push(g[i].to), vis[g[i].to] = true;
}
}
Floyd
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);