最短路径,就是地名是字符串,以前写这题是用字典树来hash,那样写起来麻烦点 下面是用map来hash地名的。 //pass:用邻接表写不知为何就是过不掉, 改成邻接阵就过了。。。下回再看看 004443152010-06-30 15:03:13Accepted10031265 MS392 KBGNU C++Slave_wc #include <cstdio> #include <cstring> #include <string> #include <map> #include <queue> #include <algorithm> using namespace std; #define MAXN 155 #define MAX 0x3fffffff bool hash[MAXN]; int maze[MAXN][MAXN]; int dis[MAXN]; struct Dij { int id; int dis; bool friend operator < (const Dij a, const Dij b) { return a.dis > b.dis; } }; Dij now, next; void Init() { for (int i = 0; i <= MAXN; i++) { maze[i][i] = 0; dis[i] = MAX; for (int j = i + 1; j <= MAXN; j++) { maze[i][j] = maze[j][i] = MAX; } } } int Bfs(int st, int ed, int n) { priority_queue<Dij> Q; now.id = st; now.dis = 0; dis[st] = 0; Q.push(now); memset(hash, false, sizeof(hash)); while (!Q.empty()) { now = Q.top(); Q.pop(); if (hash[now.id]) { continue; } if (now.id == ed) { return now.dis; } hash[now.id] = true; for (int j = 1; j <= n; j++) { if (!hash[j] && dis[now.id] + maze[now.id][j] < dis[j]) { dis[j] = dis[now.id] + maze[now.id][j]; next.id = j; next.dis = dis[j]; Q.push(next); } } } return -1; } int main() { int i, n, t, s, d, ss, dd, c; int st, ed; char aa[33], bb[33]; string a, b; while (scanf("%d", &n) != EOF) { if (n == -1) break; Init(); int k = 1; map<string, int> hash_str; scanf("%s %s", aa, bb); a = ""; b = ""; a += aa; b+= bb; if (!hash_str[a]) { hash_str[a] = k++; } if (!hash_str[b]) { hash_str[b] = k++; } st = hash_str[a]; ed = hash_str[b]; for (i = 0; i < n; i++) { scanf("%s %s %d", aa, bb, &c); a = ""; b = ""; a += aa; b+= bb; if (!hash_str[a]) { hash_str[a] = k++; } if (!hash_str[b]) { hash_str[b] = k++; } int tmpa = hash_str[a]; int tmpb = hash_str[b]; if (c < maze[tmpa][tmpb]) { maze[tmpa][tmpb] = maze[tmpb][tmpa] = c; } } int ans = Bfs(st, ed, k); printf("%d/n", ans); } return 0; }