已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
//经典的单源 最短路 ,用Dijkstra,这里要注意的是有重边,取最小的那个。
已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
//经典的单源 最短路 ,用Dijkstra,这里要注意的是有重边,取最小的那个。
#include<iostream>
#include<cstdio>
#define min(a,b) (a>b? b:a)
#define inf 100000000
using namespace std;
int map[200][200];
int d[200],f[200];//d 表示可访问的结点,f表示开始到现在的距离
int n,m;
void pri()
{
int i;
for(i=0;i<n;i++)printf("%d ",f[i]);
printf("\n");
}
void Dijkstra(int s,int e)
{
int i,j;
int minj,min;
for(i=0;i<n;i++)//初始化
{
f[i]=map[s][i];
d[i]=1;
}
f[s]=0;
for(i=0;i<n;i++)//用i条路
{
min=inf;
for(j=0;j<n;j++)
{
if(d[j]!=0&&f[j]<min)
{
min=f[j];
minj=j;
}
}
d[minj]=0;
for(j=0;j<n;j++)
{
if(d[j]!=0&&f[j]>f[minj]+map[minj][j])//之前决策点minj到j 和原来的j的比较
{
f[j]=f[minj]+map[minj][j];
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j;
int s,e;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
map[i][j]=inf;
map[j][i]=inf;
}
map[i][i]=0;
}
int a,b,c;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b]=min(map[a][b],c);
map[b][a]=min(map[a][b],c);
}
scanf("%d%d",&s,&e);
Dijkstra(s,e);
if(f[e]!=inf)
printf("%d\n",f[e]);
else printf("-1\n");
}
return 0;
}