#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
const int MAX = 1000000;
const int MA = 205;
int dis[MA];
int n; //结点数量
typedef pair<int, int> pairs;
struct Edge {
int x; //起点
int y; //终点
int distance; //起点与终点之间的距离
Edge(int u, int v, int w) {
x = u;
y = v;
distance = w;
}
};
int dijkstra(int st, int ed, vector<Edge> G[]) {
priority_queue<pairs> que; //定义一个优先队列
for (int i = 0; i < n; i++) {
dis[i] = ((i == st)?0:MAX);
}
que.push(make_pair(dis[st], st));
while (!que.empty()) {
pairs top = que.top();
que.pop();
int x = top.second;
if (top.first != dis[x]) continue;
int a = G[x].size();
for (int j = 0; j < a; j++) {
int yy = G[x][j].y;
int dist = G[x][j].distance;
if (dis[yy] > dis[x]+dist) {
dis[yy] = dis[x]+dist;
que.push(make_pair(dis[yy], yy));
}
}
}
if (dis[ed] == MAX) return -1;
else return dis[ed];
}
int main() {
int cases;
cin >> cases;
int lines;
string start, end;
int d;
while (cases--) {
cin >> lines;
vector<Edge> edge[MA];
map<string, int> maps;
n = 0;
for (int i = 0; i < lines; i++) {
cin >> start >> end >> d;
if (!maps.count(start))
maps.insert(make_pair(start, n++));
if (!maps.count(end))
maps.insert(make_pair(end, n++));
Edge e1(maps[start], maps[end], d);
Edge e2(maps[end], maps[start], d);
edge[maps[start]].push_back(e1);
edge[maps[end]].push_back(e2);
}
string st, ed;
cin >> st >> ed;
if (st == ed) cout << 0 << endl;
else if (!maps.count(st) || !maps.count(ed)) cout << -1 << endl;
else cout << dijkstra(maps[st], maps[ed], edge) << endl;
}
return 0;
}
Campus
最新推荐文章于 2021-07-05 22:30:55 发布