题目链接
菜狗写了个dijstra堆优化算法的模板,但是忘记边开数组要二倍,还有利用数组存储邻接表;
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> p;
int n,m,s;
int w[200005],h[100005],nextb[200005],to[200005];
int dis[100005],vis[100005]={0};
int ans=1;
void add(int u,int v,int c){ //这个自己写的邻接表数组的存储;
w[ans]=c; //记录边的权值
to[ans]=v; //记录边的端点
nextb[ans]=h[u];
h[u]=ans++;
}
void dijkstra(){
priority_queue<p,vector<p>,greater<p>>heap;//
heap.push({0,s});//前面记录距离,后面表示已经进去的点
dis[s]=0;
while(heap.size()){
p t=heap.top(); //出来以后就不进去了
heap.pop();
int ver=t.second;
int dist=t.first; //取最小的;
if(vis[ver]) continue;
vis[ver]=1;
for(int i=h[ver];i!=-1;i=nextb[i]){
int j=to[i];
if(dist+w[i]<dis[j]){
dis[j]=dist+w[i];
heap.push({dis[j],j});
// cout<<dist<<endl;
}
}
}
}
int main()
{
memset(h,-1,sizeof(h));
memset(dis,0x3f3f3f3f,sizeof(dis)); //一定要记得 边的初值一定要很大;
scanf("%d%d%d",&n,&m,&s);
int u,v,c;
for(int i=0;i<m;i++){
scanf("%d%d%d",&u,&v,&c);
add(u,v,c);
}
dijkstra();
for(int i=1;i<=n;i++)
printf("%d ",dis[i]);
return 0;
}
浅浅记录一下~~~