用惯了Dijkstra,尝试着用老师上课教的Floyd算法。
Floyd算法是一个经典的动态规划算法,改算法利用了中间节点的概念,简单地说就是求一点 i 到 一点 j 的的距离,可以通过其中中间点进而进行求解。
详情可以参考一下博客:
http://www.cppblog.com/wing/archive/2011/03/10/141511.html
#include <iostream>
#include <stack>
#include <cstdio>
#include <queue>
#include <vector>
#include <map>
#include <algorithm>
#include <iomanip>
#include <cstring>
using namespace std;
const int maxn = 1000000;
map<string, int> places;
int tot = 0;
void floyd(int n,int dis[][200]) {
for (int k = 0; k < n; k++)
for (int i = 0; i < n; i++)
if (dis[i][k] < maxn)
for (int j = 0; j < n; j++)
if (dis[k][j] < maxn)
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
}
int main() {
int tst;
cin >> tst;
int dis[200][200];
while (tst--) {
int roadNum;
cin >> roadNum;
int weight;
string p1, p2;
places.clear();
tot = 0;
for (int i = 0; i < 200; i++)
for (int j = 0; j < 200; j++)
if (i != j)
dis[i][j] = maxn;
else
dis[i][j] = 0;
for (int i = 0; i < roadNum; i++) {
cin >> p1 >> p2 >> weight;
if (places.find(p1) == places.end())
places[p1] = tot++;
if (places.find(p2) == places.end())
places[p2] = tot++;
dis[places[p1]][places[p2]] = weight;
dis[places[p2]][places[p1]] = weight;
}
floyd (tot,dis);
string S, T;
cin >> S >> T;
if (S == T)
cout << 0 << endl;
else if (places.find(S) == places.end()
|| places.find(T) == places.end())
cout << -1 << endl;
else {
int v1 = places[S], v2 = places[T];
if (dis[v1][v2] >= maxn)
cout << -1 << endl;
else
cout << dis[v1][v2] << endl;
}
}
return 0;
}