最短路算法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;
}
posted @ 2022-10-11 18:58  Appreciate_小白  阅读(10)  评论(0)    收藏  举报