其他分享
首页 > 其他分享> > 2022-7-6

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