迪杰特斯拉算法堆优化
#include<bits/stdc++.h>
using namespace std;
class N{
public:
int x;
int w;
bool operator < (N a) const{
return this->w>a.w;
}
N(int a,int b): x(a),w(b) {
}
N(){
x=0;
w=0;
}
}
};
const long inf=2147483647;
vector<N> vec[100005];
int dis[100005];
int n;
int m;
int s;
void dijkstra(int x){
int le[n+1];
priority_queue<N> que;
for(int i=1;i<=n;i++){
dis[i]=inf;
}
memset(le,0,sizeof(le));
que.push(N(x,0));
dis[x]=0;
while(que.empty()==0){
N t=que.top();
que.pop();
if(le[t.x]==1){
continue;
}
le[t.x]=1;
int len=vec[t.x].size();
for(int i=0;i<len;i++){
if(dis[vec[t.x][i].x]>dis[t.x]+vec[t.x][i].w){
dis[vec[t.x][i].x]=dis[t.x]+vec[t.x][i].w;
que.push(N(vec[t.x][i].x,dis[vec[t.x][i].x]));
}
}
}
}
int main()
{
int u,v,w;
cin>>n>>m>>s;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
vec[u].push_back(N(v,w));
}
dijkstra(s);
for(int i=1;i<=n;i++)
{
cout<<dis[i]<<" ";
}
}