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 阅读(138) 评论(0) 编辑 收藏 举报