思路:最短路+floyd
注意事项:由于输入的数据中会有重边的出现,那么如果出现重边的时候应该取值小的那一个。(这个trick让我WA了很久)
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 210
#define INF 0xFFFFFFF
long long dis[MAXN][MAXN];
int vis[MAXN];
int star , end;
int n , m;
void init(){
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < n ; j++){
if(i == j)
dis[i][j] = 0;
else
dis[i][j] = INF;
}
}
}
long long min(long long a , long long b){
return a < b ? a : b;
}
void floyd(){
for(int k = 0 ; k < n ; k++){
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < n ; j++)
dis[i][j] = min(dis[i][j] , dis[i][k]+dis[k][j]);
}
}
}
int main(){
// freopen("input.txt" , "r" , stdin);
int value;
while(scanf("%d%d" , &n , &m) != EOF){
init();
for(int i = 0 ; i < m ; i++){
scanf("%d%d%d" , &star , &end , &value);
if(dis[star][end] == INF)
dis[star][end] = dis[end][star] = value;
else{
if(dis[star][end] > value)
dis[star][end] = dis[end][star] = value;
}
}
scanf("%d%d" , &star , &end);
floyd();
if(dis[star][end] != INF)
printf("%lld\n" , dis[star][end]);
else
printf("-1\n");
}
return 0;
}