#include<bits/stdc++.h>
using namespace std;
const int maxsize=5 ;//maxsize为结点总数
int e[maxsize+1][maxsize+1];//邻接矩阵
int u=-1;//权最小的待更新的结点
int dist[maxsize+1];//dist[i] 即为起点到结点i的距离
bool vis[maxsize+1];//记录每个节点是否被判断过
void dijkstra();
int main(){
for(int i=1;i<=maxsize;i++){
for(int j=1;j<=maxsize;j++){
if(i==j){ e[i][j]=0;}
else{ e[i][j]=INT_MAX;}
}
}
int x,y,L;
cout<<"请输入边数:";
int temp;cin>>temp;
cout<<"请输入各边的起点,终点和权重:";
for(int i=0;i<temp;i++){
cin>>x>>y>>L;
e[x][y]=L;
}
for(int i=1;i<=maxsize;i++){
dist[i]=e[1][i];
}
vis[1]=true;//起点设为已判断过
dijkstra();
for(int i=1;i<=maxsize;i++){
cout<<dist[i]<<endl;
}
//以上完成了邻接矩阵的初始化
}
void dijkstra(){
for(int i=1;i<=maxsize-1;i++){//除起点外要判断maxsize-1次
int min=INT_MAX;
for(int j=1;j<=maxsize;j++){
if(vis[j]==false&&dist[j]<min){
u=j;min=dist[j];//寻找权值最小的待更新结点
}
}
vis[u]=true;
//松弛
for(int v=1;v<=maxsize;v++){
if(e[u][v]<INT_MAX){//找出所有u的可达点v
if(dist[v]>dist[u]+e[u][v]){
dist[v]=dist[u]+e[u][v];
}
}
}
}
}
测试:
结果: