求最短路版的畅通工程。(这个省终于畅通了,可喜可贺,可喜可贺)
这次直接floyed算法。要注意S == T需要特判。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int inf = 1 << 25 ;
int n , m ;
int dis[205][205] = {0} ;
void init() {
for (int i = 0 ; i < n ; i ++) {
for (int j = 0 ; j < n ; j ++) {
dis[i][j] = inf ;
}
}
}
void floyed() {
for (int k = 0 ; k < n ; k ++) {
for (int i = 0 ; i < n ; i ++) {
for (int j = 0 ; j < n ; j ++) {
if (i!=j && i!=k && j!=k && dis[i][k]+dis[k][j] < dis[i][j]) {
dis[i][j] = dis[i][k] + dis[k][j] ;
}
}
}
}
}
int main() {
//freopen("in.txt" , "r" , stdin) ;
while (cin >> n >> m) {
init() ;
while (m --) {
int A , B , X ;
cin >> A >> B >> X ;
if (X < dis[A][B]) {
dis[A][B] = dis[B][A] = X ;
}
}
int S , T ;
cin >> S >> T ;
if (S == T) {
cout << 0 << endl ;
continue ;
}
floyed() ;
if (dis[S][T] >= inf) cout << -1 << endl ;
else cout << dis[S][T] << endl ;
}
return 0 ;
}