djstra单源最短路径.
#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <memory.h>
#include <cstring>
using namespace std;
const int MAXN = 1000005;
int road[202][202];
bool used[202];
int minlength[202];
int number;
int djstra(int start,int end)
{
memset(used,false,sizeof(used));
for(int i = 0;i <= number;i++)
minlength[i] = (i == start ? 0 : MAXN);
used[start] = true;
for(int i = 0;i <= number;i++)
{
int temp_min = MAXN,a = start;
for(int j = 0;j <= number;j++)
{
if(!used[j] && minlength[j] < temp_min)
{
temp_min = minlength[j];
a = j;
}
}
used[a] = true;
for(int i = 0;i <= number;i++)
{
minlength[i] = min(minlength[i],minlength[a] + road[a][i]);//更新从a出发到其他点的距离
}
}
if(used[end])
return minlength[end];
else
return -1;
}
int main()
{
int n,m;
cin >> n;
while(n--)
{
cin >> m;
map<string,int> maps;//实现string和int的映射
number = 0;
for(int i = 0; i < 202;i++)
for(int j = 0;j < 202;j++)
road[i][j] = ((i == j) ? 0 : MAXN);
string s1,s2;
for(int i = 0;i < m;i++)
{
int length;
cin >> s1 >> s2 >> length;
if(!maps.count(s1))//没出现过此点
maps[s1] = ++number;
if(!maps.count(s2))
maps[s2] = ++number;
road[maps[s1]][maps[s2]] = road[maps[s2]][maps[s1]] = length;
}
cin >> s1 >> s2;
if(s1 == s2)
cout << 0 << endl;
else if(!maps.count(s1) || (!maps.count(s1)))//有一条边不存在
cout << -1 << endl;
else
cout << djstra(maps[s1],maps[s2]) << endl;
}
return 0;
}