朴素的dijkstra适合用于处理稠密图即其 n 2 n^2 n2<m,其复杂度为 n 2 n^2 n2,要注意无向图需要开两倍的点数组,存图时需要多存一条边。
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int a[N][N],dis[N],vis[N],n,m,s;
void dijkstra(){
memset(dis,0x3f,sizeof dis);
dis[s]=0;
for(int i=1;i<n;i++){
int x=0;
for(int j=1;j<=n;j++)
if(!vis[j]&&(x==0||dis[j]<dis[x]))x=j;//找出最小的点
vis[x]=1;
for(int j=1;j<=n;j++){
dis[j]=min(dis[j],dis[x]+a[x][j]);//用最小点更新其他点
}
}
//if(dis[n]==0x3f3f3f3f)return -1; //无法到达则返回-1,注意比较0x3f的写法
//return dis[n];
}
int main(){
cin>>n>>m>>s;
memset(a,0x3f,sizeof a);
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d %d %d",&u,&v,&w);
a[u][v]=min(w,a[u][v]);//处理重边
}
dijkstra();
for(int i=1;i<=n;i++)
cout<<dis[i]<<" ";
return 0;
}