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 阅读(170) 评论(0) 收藏 举报
浙公网安备 33010602011771号