#include<iostream>
#include<cstring>
using namespace std;
const int N=105;
int mp[N][N];//领接矩阵
int dis[N];
int vis[N];
int n,m;
int pre[N];
void dijkstra(int s){
memset(vis,0,sizeof(vis));//0表示未确定,1表示已确定
memset(dis,0x3f,sizeof(dis));
dis[s]=0;
while(1){
//在未确定里的点找最小的
int mini=0,min=0x3f3f3f3f;
for(int i=1;i<=n;i++){
if(vis[i]==0&&min>dis[i]){
min=dis[i];
mini=i;
}
}
if(mini==0) break;//如果没有未确定的点,则结束
vis[mini]=1;
for(int i=1;i<=n;i++){
if(dis[mini]+mp[mini][i]<dis[i]){
dis[i]=dis[mini]+mp[mini][i];
// pre[i]=mini;
}
}
}
}
//void outpath(int z){
// if(z==0) return;
// outpath(pre[z]);
// cout<<z<<" ";
//}
int main(){
while(scanf("%d%d",&n,&m)!=EOF&&n){
memset(mp,0x3f,sizeof(mp));
while(m--){
int a,b,w;
cin>>a>>b>>w;
mp[a][b]=mp[b][a]=w;
}
dijkstra(1);//原点为1
cout<<dis[n]<<endl;
// outpath(n);
// cout<<endl;
}
return 0;
}
也可以输出最短路的路径:
#include<iostream>
#include<cstring>
using namespace std;
const int N=105;
int mp[N][N];//领接矩阵
int dis[N];
int vis[N];
int n,m;
int pre[N];
void dijkstra(int s){
memset(vis,0,sizeof(vis));//0表示未确定,1表示已确定
memset(dis,0x3f,sizeof(dis));
dis[s]=0;
while(1){
//在未确定里的点找最小的
int mini=0,min=0x3f3f3f3f;
for(int i=1;i<=n;i++){
if(vis[i]==0&&min>dis[i]){
min=dis[i];
mini=i;
}
}
if(mini==0) break;//如果没有未确定的点,则结束
vis[mini]=1;
for(int i=1;i<=n;i++){
if(dis[mini]+mp[mini][i]<dis[i]){
dis[i]=dis[mini]+mp[mini][i];
pre[i]=mini;
}
}
}
}
void outpath(int z){
if(z==0) return;
outpath(pre[z]);
cout<<z<<" ";
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF&&n){
memset(mp,0x3f,sizeof(mp));
while(m--){
int a,b,w;
cin>>a>>b>>w;
mp[a][b]=mp[b][a]=w;
}
dijkstra(1);//原点为1
cout<<dis[n]<<endl;
outpath(n);
cout<<endl;
}
return 0;
}