P4779 【模板】单源最短路径(标准版)
djsl+优先队列求单源最短路。
#include<bits/stdc++.h> using namespace std; typedef long long int ll; const int maxn=5*1e5+5; vector<pair<ll,ll> >v[maxn]; ll dis[maxn]; int vis[maxn]; int n,m,s,k,pos; priority_queue<pair<ll,ll> >q; void djl(){//其实就是bfs while(!q.empty()){ k=q.top().second;q.pop(); if(vis[k])continue; vis[k]=1; for(int i=0;i<v[k].size();i++){ int t=v[k][i].first; if(dis[t]>dis[k]+v[k][i].second){ dis[t]=dis[k]+v[k][i].second; } if(!vis[t]) q.push(make_pair(-dis[t],t)); } } } int main() { scanf("%d%d%d",&n,&m,&s); fill(dis,dis+maxn,1e9); fill(vis,vis+maxn,0); dis[s]=0; for(int i=1;i<=m;i++){ int a,b,c; scanf("%d%d%d",&a,&b,&c); v[a].push_back(make_pair(b,c)); } q.push(make_pair(-dis[s],s));///pair是大顶堆(处理成负值,top的就是最小的,然后先按pair的第一个排序,再按第二个,所以-dis在前面) djl(); for(int i=1;i<=n;i++){ cout<<dis[i]<<" "; } return 0; }