vector神教实现最短路模版
${\LARGE \mathcal{SPFA} } $
#include <bits/stdc++.h>
#define otto auto
using namespace std;
struct edge
{
int v, w;
// v --> to, w --> value
};
const int maxn = 1e5 + 5; // 点数
vector<edge> e[maxn];
int dis[maxn], cnt[maxn], vis[maxn];
queue<int> q;
bool spfa(int n, int s)
{
memset(dis, 0x3f, sizeof(dis));
dis[s] = 0, vis[s] = 1;
q.push(s);
while (!q.empty())
{
int u = q.front();
q.pop(), vis[u] = 0;
for (otto ed : e[u])
{
int v = ed.v, w = ed.w;
if (dis[v] > dis[u] + w)
{
dis[v] = dis[u] + w;
cnt[v] = cnt[u] + 1; // 记录最短路经过的边数
if (cnt[v] >= n)
return false;
// 在不经过负环的情况下,最短路至多经过 n - 1 条边
// 因此如果经过了多于 n 条边,一定说明经过了负环
if (!vis[v])
q.push(v), vis[v] = 1;
}
}
}
return true;
}
int main()
{
int n, m, s;
cin >> n >> m >> s;
for (int i = 1; i <= m; i++)
{
int u, v, w;
cin >> u >> v >> w;
edge inp;
inp.v = v;
inp.w = w;
e[u].push_back(inp);
}
spfa(n, s);
for (int i = 1; i <= n; i++)
{
if (i == s)
cout << 0 << ' ';
else
{
if(dis[i] == 0x3f3f3f3f)
cout << 2147483647 <<' '; //若不能到达
else
cout << dis[i] << ' ';
}
}
}
${\LARGE \mathcal{Dijkstra} } $
#include <bits/stdc++.h>
using namespace std;
struct Edge
{
int v, w;
// v --> to, w --> value
friend bool operator<(const Edge &x, const Edge &y)
{
return x.w > y.w; //NOTICE!!!!
}
};
const int maxn = 1e5 + 5;
vector<Edge> e[maxn];
priority_queue<Edge> q;
int dis[maxn], vis[maxn], n, m, s;
void dijkstra()
{
dis[s] = 0;
q.push({s, 0});
while (!q.empty())
{
Edge inp = q.top();
q.pop();
int p = inp.v;
int tot = e[p].size();
if (vis[p])
continue;
vis[p] = 1;
for (int j = 0; j < tot; j++)
{
int v = e[p][j].v;
if (dis[v] > dis[p] + e[p][j].w)
{
dis[v] = dis[p] + e[p][j].w;
if (!vis[v])
{
q.push(Edge{v, dis[v]});
}
}
}
}
return;
}
int main()
{
cin >> n >> m >> s;
for (int i = 1; i <= n; i++)
dis[i] = 2147483647;
for (int i = 1; i <= m; i++)
{
int x, y, w;
cin >> x >> y >> w;
Edge inp;
inp.v = y, inp.w = w;
e[x].push_back(inp);
}
dijkstra();
for (int i = 1; i <= n; i++)
{
cout << dis[i] << ' ';
}
return 0;
}
${\LARGE \mathcal{Dijkstra} } $
按照开始点到点n的顺序输出,如果倒序输出则删掉stack处理部分。
#include <bits/stdc++.h>
using namespace std;
struct Edge
{
int v, w;
// v --> to, w --> value
friend bool operator<(const Edge &x, const Edge &y)
{
return x.w > y.w;
}
};
const int maxn = 1e5 + 5;
vector<Edge> e[maxn];
//NEW
stack<int> out;
int pre[maxn];
//NEW
priority_queue<Edge> q;
int dis[maxn], vis[maxn], n, m, s;
void dijkstra()
{
dis[s] = 0;
q.push({s, 0});
while (!q.empty())
{
Edge inp = q.top();
q.pop();
int p = inp.v;
int tot = e[p].size();
if (vis[p])
continue;
vis[p] = 1;
for (int j = 0; j < tot; j++)
{
int v = e[p][j].v;
if (dis[v] > dis[p] + e[p][j].w)
{
dis[v] = dis[p] + e[p][j].w;
if (!vis[v])
{
q.push(Edge{v, dis[v]});
//NEW
pre[v] = p;
//NEW
}
}
}
}
return;
}
int main()
{
cin >> n >> m;
s = 1;
for (int i = 1; i <= n; i++)
{
dis[i] = 2147483647;
//NEW
pre[i] = -1;
//NEW
}
for (int i = 1; i <= m; i++)
{
int x, y, w;
cin >> x >> y >> w;
Edge inp;
inp.v = y, inp.w = w;
e[x].push_back({y, w});
e[y].push_back({x, w});
}
dijkstra();
//NEW
for (int i = n; i != -1; i = pre[i])
{
out.push(i);
}
int flag = 0;
while (!out.empty())
{
cout << out.top() << ' ';
out.pop();
flag = 1;
}
if(flag == 0)
cout << -1 << ' ';
//NEW
return 0;
}

浙公网安备 33010602011771号