2022-7-6
作者:互联网
学会了dijkstra算法的堆优化,其实就是用一个小根堆来维护队列,将距离的相反数储存起来,这样堆顶的元素距离就最小(相反数最大)。
随后遍历每个点,已经遍历过的就打上visit标记不再遍历。题目:洛谷P4779.代码:
#include <bits/stdc++.h> using namespace std; struct edge{int v,w;}; vector<edge>ed[100005]; int u,d[100005],visit[100005],n,m,s,a,b,c; priority_queue<pair<int,int>> q; const long long inf=2147483647; void dijkstra_heap(){ for(int i=1;i<=n;i++)d[i]=inf; d[s]=0;q.push({0,s}); while(q.size()){ auto a=q.top();q.pop();int u=a.second; if(visit[u])continue; visit[u]=1; for(edge e:ed[u]){ int v=e.v,w=e.w; if(d[v]>d[u]+w){ d[v]=d[u]+w; q.push({-d[v],v}); } } } } int main(){ cin>>n>>m>>s; for(int i=1;i<=m;i++){ cin>>a>>b>>c; ed[a].push_back({b,c}); } dijkstra_heap(); for(int i=1;i<=n;i++)cout<<d[i]<<' '; return 0; }View Code
标签:遍历,int,long,100005,dijkstra,2022,相反数 来源: https://www.cnblogs.com/-ark/p/16450419.html