这道题是典型的最短路问题,只要简单的将Dijkstra算法用上便可以了
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define inf 9999999
using namespace std;
int n,m;
int dist[205];
int price[205][205];
int visit[205];
void Dijkstra(int n,int x)
{
memset(visit,0,sizeof(visit));
int i,p,j,min;
for (i=0;i<n;i++)
{
dist[i]=price[x][i];
}
visit[x]=1;
for (i=1;i<n;i++)
{
min=inf;
for (j=0;j<n;j++)
{
if(!visit[j] && dist[j]<min)
{
p=j;
min=dist[j];
}
}
visit[p]=1;
for (j=0;j<n;j++)
{
if(!visit[j] && dist[p]+price[p][j]<dist[j])
{
dist[j]=dist[p]+price[p][j];
}
}
}
}
int main()
{
int N,M;
int i,j,k;
while(scanf("%d%d",&N,&M)!=EOF&&N!=0&&M!=0)
{
for(i=0;i<N;i++)
for(j=0;j<N;j++)
price[i][j]=inf;
for(i=0;i<N;i++)
price[i][i]=0;
for(i=0;i<M;i++)
{
int st,ed,l;
scanf("%d%d%d",&st,&ed,&l);
if(l<price[st][ed])
price[st][ed]=price[ed][st]=l;
}
int s,t;
scanf("%d%d",&s,&t);
Dijkstra(N,s);
if(dist[t]==inf)
printf("-1\n");
else printf("%d\n",dist[t]);
}
return 0;
}