如果n>100000,m>200000的话,就只能使用set优化过后的dijkstra算法计算最短路
最短路2
#include <bits/stdc++.h>
using namespace std;
int n, m, k;
struct node {
int y, v;
node(int _y, int _v) {
y = _y;
v = _v;
}
};
vector<node> edges[100001];
set<pair<int, int>> q;
int dis[100001];
inline void dijkstra(int s, int f) {
memset(dis, 127, sizeof(dis));
dis[s] = 0;
q.clear();
for (int i = 1; i <= n; i++) {
q.insert({dis[i], i});
}
for (; !q.empty();) {
int x = q.begin()->second;
if (x == f || dis[x] > 1 << 30) {
break;
}
q.erase(q.begin());
for (auto i : edges[x]) {
if (dis[x] + i.v < dis[i.y]) {
q.erase({dis[i.y], i.y});
dis[i.y] = dis[x] + i.v;
q.insert({dis[i.y], i.y});
}
}
}
if (dis[f] < 1 << 30) {
cout << dis[f] << '\n';
} else {
cout << "-1" << '\n';
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m >> k;
for (int i = 1; i <= m; i++) {
int x, y, v;
cin >> x >> y >> v;
edges[x].push_back((node){y, v});
}
while (k--) {
int s, f;
cin >> s >> f;
dijkstra(s, f);
}
}
最短路变式:求一个点k在有向图中的对所有点进行一个来回的最短距离。
tag:将所有边反向,就求出了其他所有点到k的距离
#include <bits/stdc++.h>
using namespace std;
int n, m, k;
struct node {
int y, v;
};
vector<node> edges[100001], edges2[100001];
set<pair<int, int>> q;
int dis[100001], dis2[100001];
inline void dijkstra(vector<node> edges[], int s) {
memset(dis, 127, sizeof(dis));
dis[s] = 0;
q.clear();
for (int i = 1; i <= n; i++) {
q.insert({dis[i], i});
}
while (!q.empty()) {
int x = q.begin()->second;
q.erase(q.begin());
for (auto i : edges[x]) {
if (dis[x] + i.v < dis[i.y]) {
q.erase({dis[i.y], i.y});
dis[i.y] = dis[x] + i.v;
q.insert({dis[i.y], i.y});
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m >> k;
for (int i = 1; i <= m; i++) {
int x, y, v;
cin >> x >> y >> v;
edges[x].push_back((node){y, v});
edges2[y].push_back((node){x, v});
}
dijkstra(edges2, k);
memcpy(dis2, dis, sizeof(dis));
dijkstra(edges, k);
int ans = 0;
for (int i = 1; i <= n; i++) {
ans = max(ans, dis[i] + dis2[i]);
}
cout << ans << '\n';
}
最短路计数
#include <bits/stdc++.h>
using namespace std;
const int P = 100003;
int n, m;
struct node {
int y, v;
};
vector<node> edges[1000001];
set<pair<int, int>> q;
int dis[1000001], cnt[1000001];
bool vis[100001];
inline void dijkstra(int s) {
memset(dis, 127, sizeof(dis));
memset(vis, 0, sizeof(vis));
dis[1] = 0, cnt[1] = 1;
for (int i = 1; i <= n; i++) {
q.insert({dis[i], i});
}
while (!q.empty()) {
int x = q.begin()->second;
q.erase(q.begin());
for (auto i : edges[x]){
if (dis[x] + i.v < dis[i.y]){
q.erase({dis[i.y], i.y});
dis[i.y] = dis[x] + i.v;
q.insert({dis[i.y], i.y});
cnt[i.y] = cnt[x];
cnt[i.y] %= P;
} else if (dis[x] + i.v == dis[i.y]) {
cnt[i.y] += cnt[x];
cnt[i.y] %= P;
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int x, y;
cin >> x >> y;
edges[x].push_back((node){y, 1});
edges[y].push_back((node){x, 1});
}
dijkstra(1);
for (int i = 1; i <= n; i++) {
cout << cnt[i] << '\n';
}
}