优先队列优化dij算法

时间:2022-08-28 14:10:14

之前已经弄过模板了,但那个复杂一点,这个就是裸的dij,用起来更方便

输入格式:n,m,s,d分别是点数,边数,起点,终点

之后m行,输入x,y,z分别是两点即权值

题目链接:https://www.luogu.org/problemnew/show/P1339

 #include <bits/stdc++.h>
using namespace std;
const int inf=<<;
typedef long long ll;
typedef pair<int,int> P;
const double pi=acos(-);
const int mod=1e8+;
const int maxn=;
const int maxm=;
int dis[maxn];
struct edge{
int to,cost;
};
vector<edge> g[maxm];
void dij(int s){
priority_queue<P,vector<P>,greater<P> > que;
fill(dis,dis+maxn,inf);
dis[s]=;
que.push({,s});
while(!que.empty()){
P p=que.top();que.pop();
int v=p.second;
if(dis[v]<p.first) continue;
for(int i=;i<g[v].size();i++){
edge e=g[v][i];
if(dis[e.to]>dis[v]+e.cost){
dis[e.to]=dis[v]+e.cost;
que.push({dis[e.to],e.to});
}
}
}
}
int main(){
int x,y,z,n,m,s,d;scanf("%d%d%d%d",&n,&m,&s,&d);
for(int i=;i<m;i++){
scanf("%d%d%d",&x,&y,&z);
g[x].push_back({y,z});
g[y].push_back({x,z});
}
dij(s);
cout<<dis[d]<<endl;
return ;
}