题意: (N , C , and R) 图中总共有n个城市, c 辆坏掉的车停在c个城市, 修理厂在某城市x。 求c 辆车 从修理厂x出发将所有车拖回修理厂的总时间。(一辆车拖回厂后再重新出发去拖第二辆,不同时拖运。) #include <iostream> #include <cstring> #include <cstdio> #include <queue> #include <string> #include <map> using namespace std; map<string, int> hash_str; #define MAXN 1010 #define INF 0x3fffffff int maze[MAXN][MAXN]; int dis[MAXN]; bool hash[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 Bfs(int st, int n) { memset(hash, false, sizeof(hash)); for (int i = 1; i <= n; i++) { dis[i] = INF; } priority_queue<Dij> Q; now.id = st; now.dis = 0; dis[st] = 0; Q.push(now); while (!Q.empty()) { now = Q.top(); Q.pop(); if (hash[now.id]) { continue; } hash[now.id] = true; for (int j = 1; j <= n; j++) { if (!hash[j] && dis[j] > dis[now.id] + maze[now.id][j]) { dis[j] = dis[now.id] + maze[now.id][j]; next.id = j; next.dis = dis[j]; Q.push(next); } } } } void Init(int n) { for (int i = 1; i <= n; i++) { maze[i][i] = 0; for (int j = i + 1; j <= n; j++) { maze[i][j] = maze[j][i] = INF; } } } int main() { int n, c, r, i, j, st, weight; int test = 1; int ed[MAXN]; char str[MAXN], a[MAXN], b[MAXN], w[MAXN]; while (scanf("%d %d %d", &n, &c, &r) != EOF) { if (n == 0 && c == 0 && r == 0) { break; } int k = 1; Init(n); scanf("%s", str); hash_str[str] = k++; st = 1; for (i = 0; i < c; i++) { scanf("%s", str); if (!hash_str[str]) { hash_str[str] = k++; } ed[i] = hash_str[str]; } for (i = 0; i < r; i++) { scanf("%s %s %s", a, w, b); if (!hash_str[a]) { hash_str[a] = k++; } if (!hash_str[b]) { hash_str[b] = k++; } bool flag = false; bool tmp[2] = {false, false}; for (j = 0; w[j]; j++) { if (!flag && w[j] >= '0' && w[j] <= '9') { weight = atoi(w + j); flag = true; } if (w[j] == '<') { tmp[0] = true; } else if (w[j] == '>') { tmp[1] = true; } } int x = hash_str[a]; int y = hash_str[b]; if (tmp[1] && maze[x][y] > weight) { maze[x][y] = weight; } if (tmp[0] && maze[y][x] > weight) { maze[y][x] = weight; } } Bfs(1, n); int ans = 0; for (i = 0; i < c; i++) { ans += dis[ed[i]]; } for (i = 0; i < c; i++) { Bfs(ed[i], n); ans += dis[1]; } printf("%d. %d/n", test++, ans); hash_str.clear(); } return 0; }