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