这题其实是一个非常标准的Dijkstra+Heap。
想必我不用多说大家也知道,
那么就废话不多说,上代码吧!
/*luogu P4779 标准版
luogu P3371 弱化版
AC程序*/
#include<bits/stdc++.h>
using namespace std;
long long dist[100010],v;
struct edge{
long long to, next, w;
};
struct Qedge{
long long dis,id;
};
struct cmp{
bool operator()(Qedge a,Qedge b){
return a.dis>b.dis;
}
};
priority_queue<Qedge,vector<Qedge>,cmp> pq;
edge edge[500010];
long long head[100010];
bool done[100010];
void add_edge(long long num,long long U,long long V,long long w){
edge[num].to=V;
edge[num].next=head[U];
edge[num].w=w;
head[U]=num;
}
void Dijkstra(){
while(!pq.empty()){
Qedge tmp=pq.top();
pq.pop();
long long ID=tmp.id;
if(done[ID])
continue;
done[ID]=true;
for(long long i=head[ID];i;i=edge[i].next){
long long j=edge[i].to;
if(dist[ID]+edge[i].w<dist[j] && !done[j]){
dist[j]=dist[ID]+edge[i].w;
pq.push((Qedge){dist[j],j});
}
}
}
}
int main(){
long long e,s;
cin>>v>>e>>s;
for(long long i=1;i<=v;i++)
dist[i]=1e17;
for(long long i=1;i<=e;i++){
long long U,V,w;
cin>>U>>V>>w;
add_edge(i,U,V,w);
}
pq.push((Qedge){0,s});
dist[s]=0;
Dijkstra();
for(long long i=1;i<=v;i++){
if(dist[i]==1e17)
cout<<2147483647<<' '; //这是int的最大数
else
cout<<dist[i]<<' ';
}
return 0;
}
谢谢观看,记得给好评呦!!!