题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112
题意:给你各个站到各个站的距离,问你起点到终点的最短距离。(最短路)
难处理的地方在于给出的是字符串,而平常我们都是用数字做的,所以我们需把字符串都变成相对应的数字,那么问题就迎刃而解了。
////如果给出起点和终点位置一样,那么则直接输出 0 就OK了。。。

#include <iostream> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <queue> #include <cmath> #include <map> #include <stack> #include <cstring> using namespace std; #define INF 0xfffffff #define maxn 200 int maps[maxn][maxn], v[500], dist[500]; void Init() { int i, j; for(i=0; i<=155; i++) for(j=0; j<=155; j++) if(i==j) maps[i][j]=0; else maps[i][j]=maps[j][i]=INF; } int Dij(int n) { int i, j; memset(v, 0, sizeof(v)); for(i=1; i<=n; i++) dist[i] = maps[1][i]; v[1] = 1; for(i=1; i<n; i++) { int mins = INF, index; for(j=1; j<=n; j++) { if(!v[j] && dist[j] < mins) { mins = dist[j]; index = j; } } v[index] = 1; for(j=1; j<=n; j++) { if(!v[j] && mins+maps[index][j] < dist[j]) dist[j] = mins + maps[index][j]; } } return dist[2]; } int main() { int p, n, flag; while(scanf("%d", &n), n!=-1) { char a[60], b[60]; flag = 0; map<string, int> s; s.clear(); Init(); scanf("%s %s", a, b); s[a] = 1; s[b] = 2; if(strcmp(a, b) == 0) flag = 1; int cnt = 3; while(n --) { scanf("%s %s %d",a, b, &p); if(!s[a]) s[a] = cnt++; if(!s[b]) s[b] = cnt++; maps[s[a]][s[b]] = maps[s[b]][s[a]] = min(maps[s[b]][s[a]], p); } if(flag) { printf("0 "); continue; } int ans = Dij(cnt-1); if(ans == INF) ans = -1; printf("%d ", ans); } }