洛谷 P4779 【模板】单源最短路径(标准版)(Dijkstra)

题目链接

使用优先队列优化后的Dijkstra即可。

注意优先队列默认是大堆顶。(即大数在前)

可以用priority_queue<int,vector<int>,greater<int>>q;

来改写成小堆顶来寻找最小距离。

#include <algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#define MAXN 100005
using namespace std;
typedef pair<int,int> pii;
priority_queue<pii,vector<pii>,greater<pii> >q;//pii的第一个值代表距离,第二个值代表点。根据距离排序 .注意两个> >之间要加空格否则会被认为是移位 
int n,m,s,temp1,temp2,temp3,dis[MAXN],vis[MAXN];
vector<pii>map1[MAXN];//pii的第一个值为连的点,第二个值为到该点的距离。 
void dijkstra(int s){
    memset(dis,0x3f,sizeof(dis));
    memset(vis,0,sizeof(vis));
    dis[s]=0;
    q.push(make_pair(dis[s],s));
    while(!q.empty()){
        int u=q.top().second;
        q.pop();
        if(vis[u])
            continue;
        else
            vis[u]=1;
        for(int i=0;i<map1[u].size();i++){
            int v=map1[u][i].first,w=map1[u][i].second;//v为点,w为边的权值 
            if(dis[v]>dis[u]+w){    //可以更新 
                dis[v]=dis[u]+w;
                q.push(make_pair(dis[v],v)); //注意距离在第一个 
            }
        } 
    }
}
int main(){
    scanf("%d%d%d",&n,&m,&s);
    for(int i=0;i<m;i++){
        scanf("%d%d%d",&temp1,&temp2,&temp3);
        map1[temp1].push_back(make_pair(temp2,temp3));
    }
    dijkstra(s);
    for(int i=1;i<=n;i++)
        printf("%d ",dis[i]);
    return 0;
}

 

posted @ 2021-03-03 17:16  mikku  阅读(97)  评论(0)    收藏  举报