赤裸裸的最短路:Dijkstra算法 #include <iostream> #include <cstdio> #include <cstring> using namespace std; #define INF 0x3fffffff int map[110][110]; int dis[110]; bool hash[110]; void init(int n) { for (int i = 1; i <= n; i++) { map[i][i] = 0; for (int j = i + 1; j <= n; j++) { map[i][j] = map[j][i] = INF; } } } int Dijkstra(int n) { memset(hash, false, sizeof(hash)); for (int i = 2; i <= n; i++) { dis[i] = map[1][i]; } dis[1] = 0; hash[1] = true; for (int i = 2; i <= n; i++) { int min = INF; int mark = 1; for (int j = 2; j <= n; j++) { if (!hash[j] && dis[j] < min) { min = dis[j]; mark = j; } } if (min == INF) { break; } hash[mark] = true; for (int j = 2; j <= n; j++) { if (!hash[j] && min + map[mark][j] < dis[j]) { dis[j] = min + map[mark][j]; } } } return dis[n]; } int main() { int n, m, ans, a, b, c; while (scanf("%d %d", &n, &m) != EOF) { if (n == 0 && m == 0) { break; } init(n); while (m--) { scanf("%d %d %d", &a, &b, &c); if (c < map[a][b]) { map[a][b] = map[b][a] = c; } } ans = Dijkstra(n); printf("%d/n", ans); } return 0; }