题目链接 点击打开链接
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define INF 0xfffffff
using namespace std;
int n,m;
int G[205][205]; //存图
int s,t; //start and end
int dis[205]; //最短距离
bool flag[205]; //标志已经找到最短路
void dijkstra(){
memset(flag,0,sizeof(flag));
for(int i = 0;i < n;i++)
dis[i] = G[i][s];
flag[s] = 1;
int pre = s;
for(int l = 1;l < n;l++){
for(int i = 0;i < n;i++){
if(flag[i]) continue;
if(dis[pre]+G[pre][i] < dis[i])
dis[i] = dis[pre]+G[pre][i];
}
int Min = INF;
int k = 0;
for(int i = 0;i < n;i++){
if(flag[i]) continue;
if(dis[i] < Min){
Min = dis[i];
k = i;
}
}
flag[k] = true;
pre = k;
}
if(dis[t] == INF){
printf("-1\n");
}else{
printf("%d\n",dis[t]);
}
}
int main(){
int a,b,x;
while(scanf("%d%d",&n,&m) != EOF){
for(int i = 0;i < n;i++)
for(int j = 0;j < n;j++){
if(i == j) G[i][j] = 0;
else
G[i][j] = INF;
}
for(int i = 0;i < m;i++){
scanf("%d%d%d",&a,&b,&x);
G[a][b] = G[b][a] = min(x,G[a][b]);
}
scanf("%d%d",&s,&t);
dijkstra();
}
return 0;
}