dijkstra算法优化

正常的 dijkstra 因为每v 个节点,每次都要找出未被访问过的最小值 ,复杂度为O(v^2)

可以用优先队列优化,复杂度为O(E),E为Grape中的边数

https://www.luogu.org/record/25575996一道卡时间

#include<bits/stdc++.h>
#define inf (0x3f3f3f3f)
using namespace std;
int main()
{
    ios::sync_with_stdio(false);    cin.tie(0),cout.tie(0);
    int n,m,s,u,v,w;
    cin>>n>>m>>s;
    vector<pair<int,int>> adj[n];
    for(int i=0;i!=m;++i)
    {
        cin>>u>>v>>w;
        --u,--v;
        adj[u].push_back(make_pair(v,w));
    }
    priority_queue<pair<int,int>> pq;
    vector<bool> vis(n,false);
    vector<int> dis(n,inf);
    dis[--s] = 0;
    pq.push(make_pair(0,s));
    while(!pq.empty())
    {
        int v = pq.top().second;
        int w = pq.top().first;
        pq.pop();
        if(dis[v] < w*-1)
            continue;//不是最短有效边
        vis[v] = true;
        for(int i=0;i!=adj[v].size();++i)
        {
            int cur = adj[v][i].first;
            if(!vis[cur]&&dis[cur] > dis[v] + adj[v][i].second)
            {
                dis[cur] = dis[v] + adj[v][i].second;
                pq.push(make_pair(dis[cur]*-1,cur));
            }
        }
    }
    for(int i=0;i!=n;++i)
        cout<<dis[i]<<" ";
}

  

posted on 2019-10-23 13:16  chengyulala  阅读(145)  评论(0编辑  收藏  举报

导航