本题是用迪杰斯克拉算法解决的,纠结了很久,无数次WA,一开始以为算法有问题,到最后才发现原来是没有注意到一些特殊情况,看来做事情都要认真细致啊!
// source code of submission 840220, Zhongshan University Online Judge System
#include <cstdio>
#include <iostream>
#include <map>
#include <algorithm>
#include <string>
#include <cstring>
#define max 100000000
using namespace std;
int a[300][300];
int dis[300];
bool visit[300];
int n, k;
int dijsk(int k1, int k2)
{
int i, j, c;
memset(visit, false, sizeof(visit));
for(i = 1; i < k; ++i) //初始化距离
{
if(i != k1)
{
dis[i] = a[k1][i];
}
}
int min;
visit[k1] = true;
dis[k1] = 0;
c = 1;
while(c < k)
{
min = max;
for(i = 1; i < k; ++i) //找出最短路径
{
if(!visit[i] && dis[i] < min)
{
min = dis[i];
j = i;
}
}
if(j == k2){
return dis[j];
}
visit[j] = true;
for(i = 1; i < k; ++i)
{
if(!visit[i] && (dis[i] > (dis[j] + a[j][i])))
{ //更新最短路径
dis[i] = dis[j] + a[j][i];
}
}
c++;
}
return dis[k2];
}
int main()
{
int t;
cin >> t;
while(t--)
{
int i, dd, j;
string p1, p2;
cin >> n;
map<string, int> m;
k = 1;
memset(a, -1, sizeof(a));
for(i = 0; i < n; ++i)
{
cin >> p1 >> p2 >> dd;
if(m.find(p1) == m.end())
{
m.insert(make_pair(p1, k++));
}
if(m.find(p2) == m.end())
{
m.insert(make_pair(p2, k++));
}
a[ m[p1] ][ m[p2] ] = dd;
a[ m[p2] ][ m[p1] ] = dd;
}
for(i = 1; i < k; ++i)
{
for(j = 1;j < k; ++j)
a[i][j] = (a[i][j] == -1) ? max : a[i][j];
}
cin >> p1 >> p2;
if(m.find(p1) == m.end() && m.find(p2) == m.end())
{
if(p1 == p2)
cout << 0 << endl;
else
cout << -1 << endl;
continue;
}
if(m.find(p1) == m.end() || m.find(p2) == m.end())
{
cout << -1 << endl;
continue;
}
int ans = dijsk(m[p1], m[p2]);
if(ans == max)
cout << -1 << endl;
else
cout << ans << endl;
}
return 0;
}