朴素Dijkstra
#include<bits/stdc++.h>
using namespace std;
const int inf=9999999;
bool book[105];
int mp[105][105];
int dis[105];
int n,m;
void Dijkstra(int s){
int start=s;
memset(dis,inf,sizeof(dis));
book[s]=1;
for(int i=1;i<=n;i++) dis[i]=min(dis[i],mp[start][i]);
int minn;
for(int i=1;i<n;i++){
minn=inf;
for(int j=1;j<=n;j++)
if(minn>dis[j]&&!book[j]){
minn=dis[j];
start=j;
}
book[start]=1;
for(int j=1;j<=n;j++) dis[j]=min(dis[j],dis[start]+mp[start][j]);
}
}
int main(){
int a,b,c,i,j;
freopen("in.txt","r",stdin);
cin>>n>>m>>j;
memset(mp,inf,sizeof(mp));
for(i=0;i<m;i++){
cin>>a>>b>>c;
mp[a][b]=c; mp[b][a]=c;
}
for(i=1;i<=n;i++) mp[i][i]=0;
Dijkstra(j);
for(i=1;i<=n;i++)
cout<<dis[i]<<' ';
cout<<endl;
return 0;
}
Dijkstra堆优化
#include<bits/stdc++.h>
using namespace std;
struct node{
int val,num;//val离出发点的最短距离,num该点编号
bool operator<(const node &a) const{//运算符重载
return val<a.val;
}
};
int dis[1005];
vector<pair<int,int> > a[1005];//fi下一点编号,se到下一点的距离
priority_queue<node> dij;//最小堆
int n,m,s;
int main(){
int x,y,z;
freopen("in.txt","r",stdin);
cin>>n>>m>>s;
for(int i=1;i<=n;i++) dis[i]=99999999;
for(int i=1;i<=m;i++) {
cin>>x>>y>>z;
a[x].push_back(make_pair(y,z));//把相连的边保存
}
dis[s]=0;
dij.push((node){0,s});
while(!dij.empty()){
int front=dij.top().num; dij.pop();
for(int i=0;i<a[front].size();i++){//对front能到达的顶点进行松弛操作
int to=a[front][i].first,va=a[front][i].second;
if(dis[to]>dis[front]+va){
dis[to]=dis[front]+va;
dij.push((node){dis[to],to});
}
}
}
for(int i=1;i<=n;i++)
cout<<dis[i]<<' ';
cout<<endl;
return 0;
}
测试样例
4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4