最短路算法Dijkstra
朴素版本的Dijkstar,时间复杂度为O(\(n^2\)+\(m\))
堆优化版本的Dijkstra,时间复杂度为O(\(mlogn\))
下面给出两个模板,求其点数1-N的最短路。
#include <bits/stdc++.h>
using namespace std;
const int N = 510;
const int INF = 0x3f3f3f3f;
int g[N][N];
int dist[N];
bool st[N];
int dijkstra(){
memset(dist , INF , sizeof(dist);
dist[1] = 0;
for(int i = 0;i < n - 1;i++){
int t = -1;
for(int j = 1;j <= n;j++){
if(!st[j] && (t == -1 || dist[t] > dist[j])
t = j;
}
st[t] = true;
for(int j = 1;i <= n;i++){
dist[j] = fmin(dist[j] , dist[t] + g[t][j]);
}
}
if(dist[n] == INF) return -1;
return dist[n];
}
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N = 1e6 + 10;
const int INF = 0x3f3f3f3f;
int n,m;
int h[N],w[N],e[N],ne[N],idx;
int dist[N];
bool st[N];
void add(int a,int b,int c){
e[idx] = b;
w[idx] = c;
ne[idx] = h[a];
h[a] = idx++;
}
int dj(){
memset(dist , INF , sizeof(dist));
dist[1] = 0;
priority_queue<PII,vector<PII>,greater<PII>> heap;
heap.push({0,1});
while(heap.size()){
auto t = heap.top();
heap.pop();
int cur = t.second;
int distance = t.first;
if(st[cur]) continue;
st[cur] = true;
for(int i = h[cur];i != -1;i = ne[i]){
int u = e[i];
if(dist[u] > dist[cur] + w[i]){
dist[u] = dist[cur] + w[i];
heap.push({dist[u] , u});
}
}
}
if(dist[n] == INF) return -1;
return dist[n];
}
int main(){
memset(h , -1 , sizeof(h));
cin >> n >> m;
while(m--){
int a,b,c;
cin >> a >> b >> c;
add(a,b,c);
}
int res = dj();
cout << res << endl;
return 0;
}