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;
}

 

posted @ 2020-05-20 00:16  mohari  阅读(122)  评论(0编辑  收藏  举报