普通dijkstra,复杂度O(n*n)
#include<bits/stdc++.h>
using namespace std;
int n,m,f[105][105],dis[105];
bool b[105]; //n为总共的点数,m为路径数,f数组记录两个点的距离,dis数组记录每个点到原点的距离
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int aa,bb,cc;
scanf("%d%d%d",&aa,&bb,&cc);
f[bb][aa]=f[aa][bb]=cc;
}
memset(dis,1,sizeof(dis));
dis[1]=0;
for(int i=1;i<=n;i++)
if(f[1][i]) dis[i]=f[1][i]; //将刚开始与1点连接的点路径记录
for(int i=1;i<=n;i++){
int k=0;
int mn=2<<29; //一个大数
for(int j=1;j<=n;j++){
if(!b[j] && dis[i]+f[i][j]<mn && f[i][j]){
mn=dis[i]+f[i][j]; //记录最短点和路径
k=j;
}
}
if(k==0) break;
b[k]=1;
dis[k]=mn;
for(int j=1;j<=n;j++)
if(dis[k]+f[k][j]<dis[j] && f[k][j]) //更新其余点
dis[j]=dis[k]+f[k][j];
}
printf("%d",dis[n]);
}
堆优化,复杂度O(mlog(n))。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int MAXN = 10005,MAXM = 500005;
struct Edge{
int nxt,to,v;
}edge[MAXM];
int n,m,st,cnt,head[MAXN],dis[MAXN];
bool vis[MAXN];
struct cmp{
bool operator()(int x,int y){
return dis[x]>dis[y];
}
};
inline void add(int bg,int ed,int w){
edge[++cnt].to=ed;
edge[cnt].v=w;
edge[cnt].nxt=head[bg];
head[bg]=cnt;
}
inline void dijkstra(){
priority_queue<int,vector<int>,cmp> q;
memset(dis,0x3f,sizeof(dis));
q.push(st);
dis[st]=0;
while(!q.empty()){
int x=q.top();
q.pop();
if(vis[x]) continue;
vis[x]=1;
for(register int i=head[x];i;i=edge[i].nxt){
int u=edge[i].to;
dis[u]=min(dis[u],dis[x]+edge[i].v);
q.push(u);
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&st);
for(register int i=1;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
dijkstra();
for(register int i=1;i<=n;i++)
printf("%d ",dis[i]);
return 0;
}